1. 程式人生 > >java筆記--設計模式之觀察者(訂閱/釋出)模式

java筆記--設計模式之觀察者(訂閱/釋出)模式

1.定義

    定義物件間的一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。

2.解決的問題 現狀:有時我們會將一個系統分割成一系列相互協作的類,但是這樣會有一個副作用---需要維護相關物件間的一致性。這樣的話我們為了維持一致性而使得各個類之間緊密耦合,導致可重用性的降低,會給維護、擴充套件和重用都帶來不便。觀察者就是解決這類的耦合關係的。      觀察者模式使得任意樹木的觀察者不必知道彼此的存在,且主題發生變化時都可以得到主題的通知,而同步改變狀態。是一種鬆散耦合,且有更好的可重用性。 3.模式的組成結構
        抽象主題(Subject):它把所有觀察者物件的引用儲存到一個集合裡,每個主題都可以有任何數量的觀察者。抽象主題提供一個介面,可以增加和刪除觀察者物件。
      具體主題(ConcreteSubject):將有關狀態存入具體觀察者物件;在具體主題內部狀態改變時,給所有登記過的觀察者發出通知。
      抽象觀察者(Observer):為所有的具體觀察者定義一個介面,在得到主題通知時更新自己。 具體觀察者ConcreteObserver):實現抽象觀察者角色所要求的更新介面,以便使本身的狀態與主題狀態協調。 4.模式的類圖   由於自己還不會畫類圖,就網上找了一張

5.具體實現程式碼 5.1.IPrettyGirl.java 
package com.example.design.observer;
/*
 * 抽象主題角色 
 * 型別是介面或者抽象類
 */
public interface IPrettyGirl {
	public void addObservers(IObserver observers);//新增觀察者

	public void deleteObservers(IObserver observers);//刪除觀察者

	public void notifyAllObservers(String msg);//通知所有的觀察者
}
//public abstract class IPrettyGirl{
//	public abstract void addObservers(IObserver observers);//新增觀察者
//
//	public abstract void deleteObservers(IObserver observers);//刪除觀察者
//
//	public abstract void notifyAllObservers(String msg);//通知所有的觀察者
//	
//}
5.2.IObserver.java
package com.example.design.observer;
/**
 * 
 * 抽象觀察者
 *
 */
public interface IObserver {
   public void UpdateMsg(String msg); 
}
5.3 Angelababy.java
package com.example.design.observer;

import java.util.ArrayList;
import java.util.List;

/*
 * 具體主題
 * 這裡選取眾多屌絲追女神的例子
 */
public class Angelababy implements IPrettyGirl {

	// 觀察者集合
	private List<IObserver> mList = new ArrayList<IObserver>();// 注意這裡集合的泛型用的是介面型別

	public void addObservers(IObserver observers) {
		mList.add(observers);
	}

	@Override
	public void deleteObservers(IObserver observers) {
		mList.remove(observers);
	}

	@Override
	public void notifyAllObservers(String msg) {
		for (IObserver list : mList) {
			list.UpdateMsg(msg);
		}
	}

}
5.4.Observers.java
package com.example.design.observer;
/**
 * 
 * 具體觀察者
 * 屌絲男一 
 */
public class Observers implements IObserver {
	private String name;

	public  Observers(String name) {
		this.name = name;
	}

	@Override
	public void UpdateMsg(String msg) {
		// TODO 自動生成的方法存根
		if ("我不開心".equals(msg)) {
			System.out.println(name+"說: 多喝熱水");
		}
	}

}
然後多寫幾個觀察者(屌絲)類,這裡就不貼程式碼了,同4。

5.5 測試主方法

package com.example.design.observer;

/**
 * ----觀察者模式---- 
 * 
 */
public class TestMain {

	public static void main(String[] args) {
		// TODO 自動生成的方法存根
		Observers observers1 = new Observers("王大錘");
		Observers2 observers2 = new Observers2("黃曉明");
		Observers3 observers3 = new Observers3("鄭愷");
		Observers4 observers4 = new Observers4("鄧超");
		
		Angelababy angelababy = new Angelababy();

		// 註冊新增觀察者
		angelababy.addObservers(observers1);
		angelababy.addObservers(observers2);
		angelababy.addObservers(observers3);
		angelababy.addObservers(observers4);

		// 發出通知訊息
		angelababy.notifyAllObservers("我不開心");
        //刪除觀察者
		angelababy.deleteObservers(observers1);
		System.out.println("---------------------");
		angelababy.notifyAllObservers("我不開心");
	}
}
5.6.輸出結果
王大錘說: 多喝熱水
黃曉明說:多喝熱水,麼麼噠
鄭愷說:走,帶你去看電影
鄧超說:走,帶你去吃縉雲燒餅
---------------------
黃曉明說:多喝熱水,麼麼噠
鄭愷說:走,帶你去看電影
鄧超說:走,帶你去吃縉雲燒餅

6.模式的總結

   6.1 優點
    觀察者模式解除了主題和具體觀察者的耦合,讓耦合的雙方都依賴於抽象,而不是依賴具體。從而使得各自的變化都不會影響另一邊的變化。
   6.2 缺點
         依賴關係並未完全解除,抽象通知者依舊依賴抽象的觀察者。
   6.3 適用場景
         當一個物件的改變需要給變其它物件時,而且它不知道具體有多少個物件有待改變時。
一個抽象某型有兩個方面,當其中一個方面依賴於另一個方面,這時用觀察者模式可以將這兩者封裝在獨立的物件中使它們各自獨立地改變和複用。

如果上面有什麼不妥的地方,歡迎留言指正

相關推薦

java筆記--設計模式觀察(訂閱/釋出)模式

1.定義     定義物件間的一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件。這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己。 2.解決的問題 現狀:有時我們

Java設計模式觀察模式釋出/訂閱模式

1、概述 觀察者模式又稱為釋出/訂閱(Publish/Subscribe)模式 觀察者設計模式涉及到兩種角色:主題(Subject)和觀察者(Observer) (1)Subject模組 Sub

JAVA設計模式觀察模式

設計原則 設計模式 測試類 stat tin 正常 san date() 觀察者模式 轉載請註明出處:https://www.cnblogs.com/luohanguo/p/7825656.html 1、初步認識 觀察者模式的定義:   在對象之間定義了一對多的依賴

設計模式觀察日常筆記

調用 百度 summary gpo public pub read 控制臺 拷貝 最近在復習C#的基礎知識,今天剛好看到了觀察者模式,便想著在此留下個記錄,方便日後復習。 首先,概念性的東西百度上搜索有很多,這裏就不拷貝黏貼了。下面將用今天看的一個貓和老鼠的例子講解

Java 設計模式 觀察模式

float stock chan bject 17. sta chang eth int http://www.verejava.com/?id=16999149610674 package com.observer.theory; public class Test {

設計模式觀察-Java(簡單例子)

1、定義:源於GOF的Design Patterns一書。 Define a one-to-many dependency between objects so that when oneobject changes state, all its dependents are notifie

Java設計模式觀察模式(一)

觀察者模式:Observer           觀察者模式主要用於1:N的通知,當一個物件(目標物件subject或Observable)的狀態變化時,他需要及時告知一系列物件(觀察者Observer),令他們做出相應           通知觀察者的方式有兩種,分

Java設計模式觀察模式(二)

 Observerable類和Observer介面  接下來我們用給定的類實現觀察者模式:      首先我們建立目標物件(繼承Observable類): package com.pmj.observer2; import java.util.Observ

java設計模式觀察

1、初步認識 觀察者模式的定義:   在物件之間定義了一對多的依賴,這樣一來,當一個物件改變狀態,依賴它的物件會收到通知並自動更新。 大白話:   其實就是釋出訂閱模式,釋出者釋出資訊,訂閱者獲取資訊,訂閱了就能收到資訊,沒訂閱就收不到資訊。 2、這個模式的結構圖

JavaScript設計模式觀察模式(學習筆記

設計模式(Design Pattern)對於軟體開發來說其重要性不言而喻,程式碼可複用、可維護、可擴充套件一直都是軟體工程中的追求!對於我一個學javascript的人來說,理解設計模式似乎有些困難,對僅切圖、做少量互動效果的FE甚至可能不會用到,但是當你開始使用Angula

大話設計模式觀察模式總結-java實現

注:示例來自《大話設計模式》 現有如下需求 公司員工想要利用工作時間炒股票 老闆經常外出 怕被老闆看到 於是拜託前臺小姐姐 老闆回來的時候打個電話通知他們 初步程式碼實現如下 前臺祕書類 package Test14; import java.uti

設計模式觀察模式(釋出/訂閱模式:publish/subscribe)

定義了一種一對多的依賴關係,讓多個觀察者物件同時監聽某一個主題物件.這個主題物件在狀態發生變化時,會通知所有觀察者物件,使它們能夠自動更新自己 觀察者模式的關鍵物件是主題Subject和觀察者Observer.一個Subject可以有任意數目依賴它的Observer, 一

Java設計模式觀察模式(Observer Pattern)

Observer Pattern 是一種常用的設計模式,它是一種事件監聽模型。該模式有兩個角色,一個是Subject, 另一個是Observer。Subject 儲存有多個Observer的引用,一旦特定的事件發生,Subject會通知它所有的Observer,Observ

設計模式觀察模式——利用java中提供的觀察實現

java實現與自己實現的對比 一、不需要再定義觀察者和目標的介面了,JDK幫忙定義了 二、具體的目標實現裡面不需要再維護觀察者的註冊資訊了,這在Java中的Observable類裡面已經幫忙實現好了。 三、觸發通知的方式有一點變化,要先呼叫setChanged方

Java設計模式觀察模式的兩種實現

     觀察者模式就是定義物件之間的一對多依賴,這樣一來,當一個物件狀態發生改變時,它的所有依賴者都會收到通知並自動更新。  這樣的好處就是兩個或多個物件之間鬆耦合,它們依然可以互動,但不太清楚彼此的細節。觀察者模式提供了一種物件的設計,讓主題和觀察者之間鬆耦合。鬆耦合的設

折騰Java設計模式觀察模式

開發十年,就只剩下這套架構體系了! >>>   

設計模式觀察模式筆記

如何實現 首先要指定好誰當釋出者 然後給釋出者新增一個快取列表,用於存放回調函式以便通知訂閱者 釋出者釋出訊息的時候,釋出者會遍

17.java設計模式觀察模式

#### 基本需求: * 氣象站可以將每天測量到的溫度,溼度,氣壓等等,以公告的形式釋出出去(比如釋出到自己的網站或第三方) * 需要設計開放型API,便於其他第三方也能接入氣象站獲取資料 * 提供溫度、氣壓和溼度的介面 * 測量資料更新時,要能實時的通知給第三方 #### 傳統方案: * 通過對需求的

大話設計模式觀察模式

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

設計模式觀察模式

觀察者模式 observer 監聽器的底層實現 observable 群發消息 轉發機制 1、觀察者模式的簡單介紹: a、核心: - 觀察者模式主要用於 1 : N 的通知中。當一個對象(目標對象 Subject 或者 Objservable )的狀態變化時,他需要及時告知