1. 程式人生 > >Java設計模式之觀察者模式(Observer Pattern)

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 多個 放下 們的 從前,有個放羊娃。每天都去山上放羊,一天,他認為十分無聊。就想了個捉弄大家尋開心的主意。他向著山下正在種田的農夫們大聲喊:“狼來了!狼來了!救命啊!”農夫們聽到喊聲