观察者模式

发布时间 2023-06-24 12:24:34作者: 弘一

观察者模式

使用场景:一对多的关联关系,需要一套触发机制。

模式类型:观察者模式

优点

观察者与被观察者之间建立抽象的耦合,降低耦合。

观察者模式支持广播通信。

缺点:

观察者之间依赖较多,比较复杂。

  • 观察者接口
/**
 * @author admin
 */
public interface IObserver {
    /**
     * 前置操作
     */
    void before();

    /**
     * 跟新操作
     */
    void update();

    /**
     * 后置操作
     */
    void after();
}
  • 观察者实现
/**
 * @author admin
 */
public class FirstObserver implements IObserver {
    @Override
    public void before() {
        System.out.println("FirstObserver is doing before action.");
    }

    @Override
    public void update() {
        before();
        System.out.println("FirstObserver is updating.");
        after();
    }

    @Override
    public void after() {
        System.out.println("FirstObserver is doing after action.");
    }
}
  • 被观察者接口
/**
 * @author admin
 */
public interface ISubject {
    /**
     * 增加观察者
     *
     * @param observer 观察者
     * @return 是否成功
     */
    boolean addObserver(IObserver observer);

    /**
     * 移除观察者
     *
     * @param observer 观察者
     * @return 是否成功
     */
    boolean removeObserver(IObserver observer);

    /**
     * 通知所有观察者
     */
    void notifyAllObservers();
}
  • 被观察者具体实现
/**
 * 具体主题
 */
public class ConcreteSubject implements ISubject {
    List<IObserver> list = new ArrayList<>();

    @Override
    public boolean addObserver(IObserver observer) {
        list.add(observer);
        return true;
    }

    @Override
    public boolean removeObserver(IObserver observer) {
        list.remove(observer);
        return true;
    }

    @Override
    public void notifyAllObservers() {
        for (IObserver observer : list) {
            observer.update();
        }
    }
}
  • 客户端
/**
 * @author admin
 */
public class Client {
    public static void main(String[] args) {
        ConcreteSubject concreteSubject = new ConcreteSubject();
        concreteSubject.addObserver(new FirstObserver());
        concreteSubject.notifyAllObservers();
    }
}
  • 执行结果

FirstObserver is doing before action.
FirstObserver is updating.
FirstObserver is doing after action.