200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 常用的设计模式——观察者设计模式?和发布者-订阅者设计模式的区别

常用的设计模式——观察者设计模式?和发布者-订阅者设计模式的区别

时间:2021-08-31 17:20:38

相关推荐

常用的设计模式——观察者设计模式?和发布者-订阅者设计模式的区别

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;@Overridepublic void observer(Goal goal) {this.goal = goal;// 当前观察者观察了当前目标,之后目标要向观察者发送通知,// 所以要将当前观察者加入目标的观察者列表中this.goal.getObservers().add(this);}@Overridepublic void execute() {// 不同观察者接收不同的消息if(goal.getMsg() instanceof String){System.out.println("StringObserverImpl recive " + goal.getMsg());}}}package observer;public class IntegerObserverImpl implements Observer {private Goal goal;@Overridepublic void observer(Goal goal) {this.goal = goal;this.goal.getObservers().add(this);}@Overridepublic 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观察者观察目标goalstringObserver.observer(goal);integerObserver.observer(goal);// 目标分别发送两种类型消息goal.notify("abc");goal.notify(123);}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。