# 观察者模式

# 简介

行为型模式,发布订阅模式。

# 示例

/**
 * @author pengl
 * 被观察者
 */
public interface Observable {
    List<Observer> observers = new ArrayList<>();
    //添加观察者
    default void addObserver(Observer observer){
        observers.add(observer);
    }
    //移除观察者
    default void removeObserver(Observer observer){
        observers.remove(observer);
    }
    //发送密报给所有观察者
    default void nodifyObservers(String msg) {
        if (!observers.isEmpty()) {
            for (Observer observer : observers) {
                observer.update(msg);
            }
        }
    }
    //被观察者动向
    void doSomeThing();
}

/**
 * @author pengl
 * 观察者
 */
public interface Observer {
    //接收密报
    void update(String msg);
}

/**
 * @author pengl
 * 具体的被观察对象A
 */
public class ConcreteObservable_A implements Observable {
    @Override
    public void doSomeThing() {
        System.out.println("被观察者A-do some thing!");
        this.nodifyObservers("被观察者A-do some thing!");
    }
}

/**
 * @author pengl
 * 具体的观察者
 */
public class ConcreteObserver_A implements Observer {
    @Override
    public void update(String msg) {
        System.out.println("观察者A-接到密报:" + msg);
    }
}

public class ConcreteObserver_B implements Observer {
    @Override
    public void update(String msg) {
        System.out.println("观察者B-接到密报:" + msg);
    }
}

public class ConcreteObserver_C implements Observer {
    @Override
    public void update(String msg) {
        System.out.println("观察者C-接到密报:" + msg);
    }
}

# 调用

@Test
public void tt(){
    Observable observable_A = new ConcreteObservable_A();
    //添加观察者
    observable_A.addObserver(new ConcreteObserver_A());
    observable_A.addObserver(new ConcreteObserver_B());
    observable_A.addObserver(new ConcreteObserver_C());

    observable_A.doSomeThing();
}

# 控制台打印

被观察者A-do some thing! 观察者A-接到密报:被观察者A-do some thing! 观察者B-接到密报:被观察者A-do some thing! 观察者C-接到密报:被观察者A-do some thing!

# 备注

Observable和Observer,jdk已经内置了,可以直接使用。