设计模式-观察者模式 实现
觀察者模式:
已一對多的方式,通過制定一個主題,使多個不同的訂閱者能時時的接收到最新的消息。
? 注意.觀察者模式的通知次序是不被依賴的,若你需要明確通知次序或者對通知的順序有強烈的要求那么請酌情使用該模式。
定義一個主題:
?
主題中處理基本的添加/刪除 訂閱者? 消息發布 還加入一個change鎖? 可以負責消息發布的控制,將靈活的控制消息的發布,減少不必要的消息傳播。
消息的發布主要是依靠接口的特性傳播,通過實現一個訂閱者接口來設定訂閱者,主題不需要具體的訂閱者是誰,只需要在消息更新時對這個接口的所有實現發布即可。
?
public interface Subjects {void add(Object obj);void remove(Object obj);void notifyObserver();void setMessage(String msg);void setChange();} View Code?
public class Subject implements Subjects{private ArrayList<Object> observers;private String message;private boolean lock;public Subject() {observers = new ArrayList<>();}@Overridepublic void add(Object obj) {observers.add(obj);}@Overridepublic void remove(Object obj) {int i = observers.indexOf(obj);if (i > 0) {observers.remove(obj);}}@Overridepublic void notifyObserver() {if (lock) {for (int i = 0; i < observers.size(); i++) {Observers observer = (Observers)observers.get(i);observer.update(message);}lock = false;}}public void change() {setChange();notifyObserver();}@Overridepublic void setMessage(String msg) {this.message = msg;change();}@Overridepublic void setChange() {lock = true;} } View Code?
訂閱者
主題消息的發布與訂閱者之間有個共同的方法,通過這個方法訂閱者來接受發布出來的消息。 單純的實現訂閱接口但是不重寫方法而是自己編寫另一個方法就無法實現消息的接收了。
public interface Observers {public void update (String message); }public class Observer implements Observers{public Observer(Subject s) {s.add(this);}//被動訂閱 @Overridepublic void update(String message) {System.out.println("訂閱主題發布的消息:" + message);}//主動拉取//像固定的主題索取消息public void updateActive(Subjects sb) {if (sb instanceof Subject) {System.out.println("訂閱者主動向主題拉取數據");}}} View Code
?
?另外java提供了Observer和Observable現成的api可供我們直接使用,setchange的想法也是參考這api的。
雖然說java提供了線程的api類供我們直接使用,但是java提供的observable 是一個實體類 并不是接口,設計原則是針對接口變成,但是java提供的實體類破壞了這個原則。
并且java無法實現多重繼承,這樣就導致一個子類想公用observable的功能和其他某些超類的功能是就會出現沖突,必須要舍棄一部分。所以通過自己開發的接口可以大大提高靈活度。
而且通過上訴代碼應該能自己體驗整個流程。所以在正真學會這個模式之后還是推薦自己編寫,這樣不管是拓展還是修改都很方便!!!
轉載于:https://www.cnblogs.com/culushitai/p/8487047.html
總結
以上是生活随笔為你收集整理的设计模式-观察者模式 实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Verilog_Day2
- 下一篇: python3之SQLAlchemy