设计模式之-观察者模式(Observer Design Pattern)
當你訂閱一個感興趣主題消息,內容發生任何變化時都能夠得到通知,觀察者模式對你是非常有幫助的。在觀察者模式中,一個對象監控另一個對象的狀態,那這個對象被稱為觀察者,被監視的對象被稱為主題。
一個主題對象會有很多觀察者,當其內容發生改變時會通知所有觀察者。主題需提供是觀察者自身可以注冊(訂閱)和注銷(取消訂閱)方法,主題還包含一個方法來通知任何改變到所有的觀察者,使它可以發送更新通知,而觀察者也可以提供另一種方法來獲取更新。
Java提供了Observer模式的實現,通過java.util.Observable類和java.util.Observer接口實現Observer模式。但是它沒有被廣泛使用,因為實現是非常簡單的,大部分的時候,我們不會為了只是實現觀察者模式而輕易的去繼承一個類,因為Java不提供多重繼承。
Observer模式實現:
在這個例子中,我們只實現了一個簡單的主題以及觀察者可以進行訂閱功能。每當有新的消息發布到這個主題所有的觀察者都會被通知到并及時使用它們。
基本主題接口定義了基本方法,具體的主題子類去實現
Subject.java
package com.journaldev.design.observer; public interface Subject { ????//methods to register and unregister observers ????publicvoidregister(Observer obj); ????publicvoidunregister(Observer obj); ????? ????//method to notify observers of change ????publicvoidnotifyObservers(); ????? ????//method to get updates from subject ????publicObject getUpdate(Observer obj); ????? }下一步,我們將建立Observer規則,將有一個方法用來設置符合觀察者感興趣內容和獲取主題更新內容方法
Observer.java
package com.journaldev.design.observer;public interface Observer {//method to update the observer, used by subjectpublic void update();//attach with subject to observepublic void setSubject(Subject sub); }現在Observer規則已制定好,讓我們實現和處理我們的主題內容
這里簡單實現了Obsever注冊與注銷,postMessage()方法用于更新主題消息,請注意,布爾變量作用,為保持在題目的狀態的變化的軌跡和在通知觀察者使用。這個變量是必需的,因此,如果沒有及時更新,有人呼吁notifyObservers()方法時,它不發送虛假通知給觀察者。
同時注意在notifyObservers()方法中使用了同步,用于確保該通知只發布給通知發布前注冊的observer
Observer實現觀察訂閱主題變化:
MyTopicSubscriber.java
注意的update()方法它調用TopicgetUpdate()方法來獲取信息來實現。我們本來可以避免通過傳遞具體的消息作為參數傳遞給update()方法。
測試類
package com.journaldev.design.observer;public class ObserverPatternTest {public static void main(String[] args) {//create subjectMyTopic topic = new MyTopic();//create observersObserver obj1 = new MyTopicSubscriber("Obj1");Observer obj2 = new MyTopicSubscriber("Obj2");Observer obj3 = new MyTopicSubscriber("Obj3");//register observers to the subjecttopic.register(obj1);topic.register(obj2);topic.register(obj3);//attach observer to subjectobj1.setSubject(topic);obj2.setSubject(topic);obj3.setSubject(topic);//check if any update is availableobj1.update();//now send message to subjecttopic.postMessage("New Message");}}輸出結果: Obj1:: No new message Message Posted to Topic:New Message Obj1:: Consuming message::New Message Obj2:: Consuming message::New Message Obj3:: Consuming message::New Message
Observer Pattern Class Diagram
原文鏈接:http://www.journaldev.com/1739/observer-design-pattern-in-java
轉載于:https://www.cnblogs.com/happyxiaoyu02/p/6818943.html
總結
以上是生活随笔為你收集整理的设计模式之-观察者模式(Observer Design Pattern)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一个祸害我很久的东东——事件过滤器之按键
- 下一篇: tinyxml学习2