1. 观察者设计模式
观察者把自己“绑定”至目标,当目标发生变化时,目标“通知”观察者,然后观察者进行相应操作。你有没有觉得这种设计模式更像发布-订阅设计模式?其实这种设计模式和发布-订阅模式最大的区别就是观察者模式是目标发生变化,目标直接“通知”观察者;而发布-订阅模式中发布者和订阅者之间并没有直接联系,中间通过“消息中心”连接。
3. 代码实现
3.1 目标类和观察者接口代码如下。
3.2 观察者两个实现类:StringObserverImpl和IntegerObserverImpl,代码如下。
3.3 测试类及运行结果如下。
附录:代码
package observer;
import java.util.ArrayList;
public class Goal {
private Object msg;
private final ArrayList<Observer> observers = new ArrayList<>();
public Object getMsg() {
return msg;
}
public void notify(Object msg) {
this.msg = msg;
// 目标发送消息时,调用观察者的方法(相当于通知观察者),观察者根据消息执行相应操作
for(Observer ob: observers){
ob.execute();
}
}
public ArrayList<Observer> getObservers() {
return observers;
}
}
package observer;
public interface Observer {
void observer(Goal goal);
void execute();
}
package observer;
public class StringObserverImpl implements Observer {
private Goal goal;
@Override
public void observer(Goal goal) {
this.goal = goal;
// 当前观察者观察了当前目标,之后目标要向观察者发送通知,
// 所以要将当前观察者加入目标的观察者列表中
this.goal.getObservers().add(this);
}
@Override
public void execute() {
// 不同观察者接收不同的消息
if(goal.getMsg() instanceof String){
System.out.println("StringObserverImpl recive " + goal.getMsg());
}
}
}
package observer;
public class IntegerObserverImpl implements Observer {
private Goal goal;
@Override
public void observer(Goal goal) {
this.goal = goal;
this.goal.getObservers().add(this);
}
@Override
public void execute() {
if(goal.getMsg() instanceof Integer){
System.out.println("IntegerObserverImpl recive " + goal.getMsg());
}
}
}
package observer;
public class ObserverTest {
public static void main(String[] args) {
// 创建String消息观察者和Integer消息观察者以及目标
StringObserverImpl stringObserver = new StringObserverImpl();
IntegerObserverImpl integerObserver = new IntegerObserverImpl();
Goal goal = new Goal();
// 让String观察者和Integer观察者观察目标goal
stringObserver.observer(goal);
integerObserver.observer(goal);
// 目标分别发送两种类型消息
goal.notify("abc");
goal.notify(123);
}
}