Java设计模式--------观察者模式
Java設計模式--------觀察者模式:定義了一種一對多的依賴關系,讓多個觀察者對象同事監聽一個主題對象。這個主題對象發生變化時,會通知所有觀察者,使他們可以自動更新自己。
先看看下面的代碼結構圖,看的不怎么懂的小伙伴也沒什么關系。接下來會有代碼分析,看完代碼再次回來看這張圖思路就會清晰很多。
還是一樣,觀察者模式大概可以分成以下幾個類:
Subject:把所有觀察者的引用保存在一個聚集里,每個主題可以有任意數量的觀察者。抽象主題提供可以增加或者刪除觀察者的接口和通知觀察者的接口。
Observer:抽象觀察者,為所有觀察者定義接口,在得到主題對象的通知時及時更新自己。
ConcreteSubject:具體的觀察者類,實現抽象觀察者所要求的更新接口,以便使自身的狀態與主題對象的狀態相協調。
ConcreteObserver:具體的主題對象,當自身內部發生變化時給所有登記過的觀察者發送通知。
敲了一大堆的廢話,還是看代碼的實在。
代碼模擬的場景是:
員工在公司上班,老板不在時有的員工看NBA有的員工看小電影。。。。。。等。大家怕在娛樂的時候老板突然回來發現,就和前臺MM說好當老板回來的時候給大家發一個通知,大家就及時回到工作狀態。
就這樣,很簡單的。
上代碼:
Subject:
package com.tian.publish_subscribe;/*** @author 作者 : TianLuhua* @version 創建時間:2016年4月16日 下午11:03:16 通知者接口,為了與觀察者解耦而創建*/ abstract class Subject {// 通知者的actionprotected String acton;// 獲取actionprotected String getActon() {return acton;}// 注冊觀察者的方法abstract void Attach(Observer observer);// 去除觀察者的方法abstract void Detach(Observer observer);// 通知觀察者的方法abstract String Notify();}Observer: package com.tian.publish_subscribe;/*** @author 作者 : TianLuhua* @version 創建時間:2016年4月16日 下午11:10:31 觀察者抽象類*/ public abstract class Observer {// 觀察者接到前臺mm的通知調用的方法public abstract void Update();}
QianTaiMM:(這里前臺MM就是具體主題類) package com.tian.publish_subscribe;import java.util.ArrayList; import java.util.List;/*** @author 作者 : TianLuhua* @version 創建時間:2016年4月16日 下午11:15:43 通知 者接口的實現者。* 我們模擬的場景是老板回來了前臺通知開小差的員工好好工作,這里的實現者就是公司的前臺mm。*/ public class QianTaiMM extends Subject {// 觀察者隊列private List<Observer> observers = new ArrayList<Observer>();// 通知者的actionprotected String acton;// 獲取actionprotected String getActon() {return acton;}public QianTaiMM(String acton) {this.acton = acton;}// 注冊觀察者public void Attach(Observer observer) {if (observers != null) {observers.add(observer);}}// 取消注冊public void Detach(Observer observer) {if (observers != null) {observers.remove(observer);}}// 通知觀察者public String Notify() {for (Observer observer : observers) {observer.Update();}return acton;}}
NBAObserver:(這里是看NBA的員工,具體的觀察者類) package com.tian.publish_subscribe;/*** @author 作者 : TianLuhua* @version 創建時間:2016年4月16日 下午11:35:54* */ public class NBAObserver extends Observer {private String name;private Subject subject;public NBAObserver(String name, Subject subject) {super();this.name = name;this.subject = subject;}@Overridepublic void Update() {System.out.println("前臺MM:" + subject.getActon());System.out.println(name + ":關閉球賽,認真工作。");}}
XiaoDianyingObserver:(這里是看xiaodianying的員工,具體的觀察者類) package com.tian.publish_subscribe;/*** @author 作者 : TianLuhua* @version 創建時間:2016年4月16日 下午11:56:38* */ public class XiaoDianyingObserver extends Observer {private String name;private Subject subject;public XiaoDianyingObserver(String name, Subject subject) {this.name = name;this.subject = subject;}@Overridepublic void Update() {System.out.println("前臺MM:" + subject.getActon());System.out.println(name + ":關閉小電影,認真工作。");}}
下面就是客服端調用的代碼了:
package com.tian.publish_subscribe;/*** @author 作者 : TianLuhua* @version 創建時間:2016年4月16日 下午11:58:22 客戶端*/ public class Main {public static void main(String[] args) {Subject qianTaiMM = new QianTaiMM("老板回來了");qianTaiMM.Attach(new NBAObserver("小李", qianTaiMM));qianTaiMM.Attach(new XiaoDianyingObserver("小趙", qianTaiMM));qianTaiMM.Notify();} }打印輸出: 前臺MM:老板回來了 小李:關閉球賽,認真工作。 前臺MM:老板回來了 小趙:關閉小電影,認真工作。
怎么樣,很簡單吧。自己動手去實現一遍把,好記星不如爛筆頭啊。
Android中的接口回調機制,以及Button的點擊事件響應機制等內部就是用的觀察者模式。Button事件響應機制在注冊觀察者是在View類的?public void setOnClickListener(OnClickListener l)方法實現的,感興趣的小伙伴去看看吧。
休息了。總結
以上是生活随笔為你收集整理的Java设计模式--------观察者模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot+Vue项目的PDF
- 下一篇: python给pdf右上角盖章