常用的设计模式——观察者设计模式?和发布者-订阅者设计模式的区别
生活随笔
收集整理的這篇文章主要介紹了
常用的设计模式——观察者设计模式?和发布者-订阅者设计模式的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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);} }?
總結
以上是生活随笔為你收集整理的常用的设计模式——观察者设计模式?和发布者-订阅者设计模式的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么不使用volatile,其它线程也
- 下一篇: 当前线程等待某些线程运行结束再执行的几种