# 观察者模式
# 简介
行为型模式,发布订阅模式。
# 示例
/**
* @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已经内置了,可以直接使用。