Java設計模式之觀察者模式(Observer Pattern)
Observer Pattern 是一種常用的設計模式,它是一種事件監聽模型。該模式有兩個角色,一個是Subject, 另一個是Observer。Subject 儲存有多個Observer的引用,一旦特定的事件發生,Subject會通知它所有的Observer,Observer得到該通知後執行相關程式邏輯。其中,Observer只有先向Subject註冊後才能被Subject知曉。這就像訂報紙,只有我們向出版社提出訂報的申請,出版社才會把我們列入訂閱者名單,然後每當新報紙印好時,出版社會通知訂閱者取報紙。這裡訂閱的使用者就是 Observer, 出版社即 Subject。
Subject , Observer的類圖如下:
下面通過一個例項來體會一下觀察者模式。
公司需要招聘人才時,往往會去找獵頭(headhunter)。獵頭知道很多求職者(applicant)的聯絡方式,一旦有公司招人,獵頭就會給這些求職者打電話,以通過他們有工作可以做了。在這裡面,獵頭就是 Subject,求職者就是 Observer。
我們來實現這樣一個功能。設計兩個類,HeadHunter 和 Applicant,分別代表獵頭和求職者。HeadHunter 類有一個屬性 jobName,當jobName有新的值時(相當於公司要招人),HeadHunter 就通知他所知道的所有 Applicant 告訴他們有工作了。類圖如下:
Subject 介面定義:
public interface Subject {
void registerObjserver(Observer ob);
void removeObserver(Observer ob);
void notifyObservers();
}
Observer 介面定義:
public interface Observer {
void update(Subject subject);
}
獵頭類定義:
public class HeadHunter implements Subject { private List<Observer> obList = new ArrayList<Observer>(); private boolean isNotify = true; private String jobName; /** * 註冊一個Observer */ @Override public void registerObjserver(Observer ob) { obList.add(ob); } /** * 移除一個Observer */ @Override public void removeObserver(Observer ob) { obList.remove(ob); } /** * 通知所有的Observer */ @Override public void notifyObservers() { if (true == isNotify) { performNotify(); isNotify = false; } } /** * 新增一個新的工作。新增完成後馬上通知所有Observer * @param jobName */ public void setJobName(String jobName) { this.jobName = jobName; isNotify = true; notifyObservers(); } private void performNotify() { for (Observer ob : obList) { ob.update(this); } } public String getJobName() { return jobName; } }
求職者類定義:
public class Applicant implements Observer {
private String name;
public Applicant(String name) {
this.name = name;
}
@Override
public void update(Subject subject) {
HeadHunter h = (HeadHunter)subject;
out.println(name + "收到通知:" + h.getJobName());
}
}
這個小程式的功能是,一旦 HeadHunter 的 setJobName() 方法被呼叫(即有新工作),HeadHunter 馬上通知它的 Applicant 告訴他們有工作了。程式測試程式碼如下:
public static void main(String[] args) {
HeadHunter hh = new HeadHunter();
// 註冊observer
hh.registerObjserver(new Applicant("張三"));
hh.registerObjserver(new Applicant("李四"));
hh.registerObjserver(new Applicant("王五"));
// 新增一個job
// 此時所有observer的update()方法都會被呼叫
hh.setJobName("Java程式設計師");
}
執行結果:
Observer Pattern 在Swing中應用非常廣泛,比如呼叫 JButton 的 addListener() 新增一個事件監聽器,此時 JButton 就是 Subject, Listener 就是 Observer。由於觀察者模式比較常用,所以需要我們好好體會掌握。
相關推薦
Java設計模式之觀察者模式(Observer Pattern)
Observer Pattern 是一種常用的設計模式,它是一種事件監聽模型。該模式有兩個角色,一個是Subject, 另一個是Observer。Subject 儲存有多個Observer的引用,一旦特定的事件發生,Subject會通知它所有的Observer,Observ
GOF23設計模式之觀察者模式(observer)
hang 事件監聽器 rgs str arr public pda import lob 一、觀察者模式概述 觀察者模式主要用於 1 :N 的通知。當一個對象(目標對象 Subject 或 Observable)的狀態變化時,它需要通知一系列對象(觀察者對象 Obser
JAVA設計模式之觀察者模式
設計原則 設計模式 測試類 stat tin 正常 san date() 觀察者模式 轉載請註明出處:https://www.cnblogs.com/luohanguo/p/7825656.html 1、初步認識 觀察者模式的定義: 在對象之間定義了一對多的依賴
Java 設計模式 之 觀察者模式
float stock chan bject 17. sta chang eth int http://www.verejava.com/?id=16999149610674 package com.observer.theory; public class Test {
23種設計模式之---觀察者模式(Observer Factory)
1.觀察者模式(行為型模式) 觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件。這個主題物件在狀態發生變化時,會通知所有的觀察者物件,使它們能夠自己更新自己。 2.觀察者模式結構圖 3.觀察者模式結構圖分析 Subject類,可理解為主題或抽象通知者
Java設計模式之觀察者模式(一)
觀察者模式:Observer 觀察者模式主要用於1:N的通知,當一個物件(目標物件subject或Observable)的狀態變化時,他需要及時告知一系列物件(觀察者Observer),令他們做出相應 通知觀察者的方式有兩種,分
Java設計模式之觀察者模式(二)
Observerable類和Observer介面 接下來我們用給定的類實現觀察者模式: 首先我們建立目標物件(繼承Observable類): package com.pmj.observer2; import java.util.Observ
設計模式----行為型模式之觀察者模式(Observer Pattern)
/** * 天氣主題(可觀察者/目標) * @author mjs * @version 1.0.0 * @filename WeatherData.java * @time 2017-3-9 下午8:26:48 * @copyright(C) 2017 **********有限公司 */ pa
設計模式之觀察者模式(Observer Pattern)
觀察者模式 觀察者模式定義了物件之間的一對多依賴,這樣一來,當一個物件改變狀態時,它的所有依賴者都會收到通知並自動更新 在觀察者模式中,發生改變的物件稱為觀察目標,而被通知的物件稱為觀察者,一個觀察目標可以對應多個觀察者。一個軟體系統常常要求在某一個物件的狀
Java設計模式之觀察者模式(釋出/訂閱模式)
1、概述 觀察者模式又稱為釋出/訂閱(Publish/Subscribe)模式 觀察者設計模式涉及到兩種角色:主題(Subject)和觀察者(Observer) (1)Subject模組 Sub
大話設計模式之觀察者模式總結-java實現
注:示例來自《大話設計模式》 現有如下需求 公司員工想要利用工作時間炒股票 老闆經常外出 怕被老闆看到 於是拜託前臺小姐姐 老闆回來的時候打個電話通知他們 初步程式碼實現如下 前臺祕書類 package Test14; import java.uti
Head First設計模式之觀察者模式(Observer Pattern)
前言: 這一節開始學習觀察者模式,開始講之前會先像第一節那樣通過一個應用場景來引入該模式。具體場景為:氣象站提供了一個WeatherData物件,該物件可以追蹤獲取天氣的溫度、氣壓、溼度資訊,WeatherData物件會隨即更新三個佈告板的顯示:目前狀況(溫度、溼度、
面向物件設計模式之---觀察者模式(Observer Pattern)
今天更新的設計模式是觀察者模式。剛才稍微去看了一眼Web前端開發,很炫!很炫! 對於這個觀察者模式,我就直接開門見山地直接放出定義和UML類圖,後面再解釋。 觀察者模式的定義如下: 觀察者模式定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽一個主題物件。這個主題物
設計模式之-觀察者模式(Observer)
觀察者模式定義物件間的一種一對多的依賴關係,以便當一個物件的狀態發生改變時,所有依賴於它的物件都得到通知並自動重新整理。 何時使用 • 當一個抽象模型有兩個方面, 其中一個方面依賴於另一方面。將這二者封裝在獨立的對 象中以使它們可以各自獨立地改
設計模式之觀察者模式——利用java中提供的觀察者實現
java實現與自己實現的對比 一、不需要再定義觀察者和目標的介面了,JDK幫忙定義了 二、具體的目標實現裡面不需要再維護觀察者的註冊資訊了,這在Java中的Observable類裡面已經幫忙實現好了。 三、觸發通知的方式有一點變化,要先呼叫setChanged方
Java設計模式之觀察者模式的兩種實現
觀察者模式就是定義物件之間的一對多依賴,這樣一來,當一個物件狀態發生改變時,它的所有依賴者都會收到通知並自動更新。 這樣的好處就是兩個或多個物件之間鬆耦合,它們依然可以互動,但不太清楚彼此的細節。觀察者模式提供了一種物件的設計,讓主題和觀察者之間鬆耦合。鬆耦合的設
研磨設計模式 之 觀察者模式(Observer) 3——跟著cc學設計系列
12.3 模式講解 12.3.1 認識觀察者模式 (1)目標和觀察者之間的關係 按照模式的定義,目標和觀察者之間是典型的一對多的關係。 但是要注意,如果觀察者只有一個,也是可以的,這樣就變相實現了目標和觀察者之間一對一的關係,這也使得在處理一
折騰Java設計模式之觀察者模式
開發十年,就只剩下這套架構體系了! >>>
17.java設計模式之觀察者模式
#### 基本需求: * 氣象站可以將每天測量到的溫度,溼度,氣壓等等,以公告的形式釋出出去(比如釋出到自己的網站或第三方) * 需要設計開放型API,便於其他第三方也能接入氣象站獲取資料 * 提供溫度、氣壓和溼度的介面 * 測量資料更新時,要能實時的通知給第三方 #### 傳統方案: * 通過對需求的
大話設計模式之觀察者模式
arm eve his watermark observer cts 多個 放下 們的 從前,有個放羊娃。每天都去山上放羊,一天,他認為十分無聊。就想了個捉弄大家尋開心的主意。他向著山下正在種田的農夫們大聲喊:“狼來了!狼來了!救命啊!”農夫們聽到喊聲