1. 程式人生 > >Java設計模式之《觀察者模式》及應用場景

Java設計模式之《觀察者模式》及應用場景

觀察者模式,又可以稱之為釋出-訂閱模式,觀察者,顧名思義,就是一個監聽者,類似監聽器的存在,一旦被觀察/監聽的目標發生的情況,就會被監聽者發現,這麼想來目標發生情況到觀察者知道情況,其實是由目標獎情況傳送到觀察者的。
觀察者模式多用於實現訂閱功能的場景,例如微博的訂閱,當我們訂閱了某個人的微博賬號,當這個人釋出了新的訊息,就會通知我們。
現在我們舉一個類似的情況,並使用程式碼來實現,為大家提供一個比較明顯的認識。
警察在找到嫌犯的時候,為了找到幕後主使,一般都會蹲點監察,這裡我有三名便衣警察來蹲點監察2名嫌犯,三名便衣分別是:張昊天、石破天、趙日天,兩名嫌犯是:大熊與黑狗,詳見程式碼:
觀察者介面:Observer
public interface Observer {
    void update(String message,String name);
}
定義三名便衣觀察者:Bianyi1、Bianyi2、Bianyi3
/**
 * 便衣警察張昊天
 */
public class Bianyi1 implements Observer {
    //定義姓名
    private String bname = "張昊天";
    @Override
    public void update(String message,String name) {
        System.out.println(bname+":"
+name+"那裡有新情況:"+ message); } } /** * 便衣警察石破天 */ public class Bianyi2 implements Observer { //定義姓名 private String bname = "石破天"; @Override public void update(String message,String name) { System.out.println(bname+":"+name+"那裡有新情況:"+ message); } } /** * 便衣警察趙日天 */ public
class Bianyi3 implements Observer { //定義姓名 private String bname = "趙日天"; @Override public void update(String message,String name) { System.out.println(bname+":"+name+"那裡有新情況:"+ message); } }
目標介面:Huairen
public interface Huairen {
    //新增便衣觀察者
    void addObserver(Observer observer);
    //移除便衣觀察者
    void removeObserver(Observer observer);
    //通知觀察者
    void notice(String message);
}
定義兩個嫌疑犯:XianFan1、XianFan2
import java.util.*;
/**
 * 嫌犯大熊
 */
public class XianFan1 implements Huairen {
    //別稱
    private String name = "大熊";
    //定義觀察者集合
    private List<Observer> observerList = new ArrayList<Observer>();
    //增加觀察者
    @Override
    public void addObserver(Observer observer) {
        if(!observerList.contains(observer)){
            observerList.add(observer);
        }
    }
    //移除觀察者
    @Override
    public void removeObserver(Observer observer) {
        if(observerList.contains(observer)){
            observerList.remove(observer);
        }
    }
    //通知觀察者
    @Override
    public void notice(String message) {
        for(Observer observer:observerList){
            observer.update(message,name);
        }
    }
}

import java.util.*;
/**
 * 嫌犯黑狗
 */
public class XianFan2 implements Huairen {
    //別稱
    private String name = "黑狗";
    //定義觀察者集合
    private List<Observer> observerList = new ArrayList<Observer>();
    //增加觀察者
    @Override
    public void addObserver(Observer observer) {
        if(!observerList.contains(observer)){
            observerList.add(observer);
        }
    }
    //移除觀察者
    @Override
    public void removeObserver(Observer observer) {
        if(observerList.contains(observer)){
            observerList.remove(observer);
        }
    }
    //通知觀察者
    @Override
    public void notice(String message) {
        for(Observer observer:observerList){
            observer.update(message,name);
        }
    }
}
測試類:Clienter
public class Clienter {
    public static void main(String[] args) {
        //定義兩個嫌犯
        Huairen xf1 = new XianFan1();
        Huairen xf2 = new XianFan2();
        //定義三個觀察便衣警察
        Observer o1 = new Bianyi1();
        Observer o2 = new Bianyi2();
        Observer o3 = new Bianyi3();
        //為嫌犯增加觀察便衣
        xf1.addObserver(o1);
        xf1.addObserver(o2);
        xf2.addObserver(o1);
        xf2.addObserver(o3);
        //定義嫌犯1的情況
        String message1 = "又賣了一批貨";
        String message2 = "老大要下來視察了";
        xf1.notice(message1);
        xf2.notice(message2);
    }
}
測試結果:
張昊天:大熊那裡有新情況:又賣了一批貨
石破天:大熊那裡有新情況:又賣了一批貨
張昊天:黑狗那裡有新情況:老大要下來視察了
趙日天:黑狗那裡有新情況:老大要下來視察了
通過上面的例項可以很明顯的看出,觀察者模式的大概模型,關鍵是什麼呢?

關鍵點:

    1、針對觀察者與被觀察者分別定義介面,有利於分別進行擴充套件。

    2、重點就在被觀察者的實現中:

      (1)定義觀察者集合,並定義針對集合的新增、刪除操作,用於增加、刪除訂閱者(觀察者)

      (2)定義通知方法,用於將新情況通知給觀察者使用者(訂閱者使用者)

    3、觀察者中需要有個接收被觀察者通知的方法。

  如此而已!
  觀察者模式定義的是一對多的依賴關係,一個被觀察者可以擁有多個觀察者,並且通過介面對觀察者與被觀察者進行邏輯解耦,降低二者的直接耦合。

  如此這般,想了一番之後,突然發現這種模式與橋接模式有點類似的感覺。

  橋接模式也是擁有雙方,同樣是使用介面(抽象類)的方式進行解耦,使雙方能夠無限擴充套件而互不影響,其實二者還是有者明顯的區別:

    1、主要就是使用場景不同,橋接模式主要用於實現抽象與實現的解耦,主要目的也正是如此,為了雙方的自由擴充套件而進行解耦,這是一種多對多的場景。觀察者模式側重於另一方面的解耦,側重於監聽方面,側重於一對多的情況,側重於一方發生情況,多方能獲得這個情況的場景。

    2、另一方面就是編碼方面的不同,在觀察者模式中存在許多獨有的內容,如觀察者集合的操作,通知的傳送與接收,而在橋接模式中只是簡單的介面引用。

相關推薦

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 {

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

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

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

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

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

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

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

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

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 )的狀態變化時,他需要及時告知

設計模式觀察模式詳解

http 通知 stat 發布-訂閱 () class arraylist nag .cn 觀察者模式又稱為發布-訂閱模式,涉及的角色有:   ●  抽象主題   ●  具體主題   ●  抽象觀察者   ●  具體觀察者 案例演示:公司發放工資的時候通知所有觀察者工資已發

23種設計模式觀察模式

主題 一個 server bsp 監聽 images 關系 .com 自動更新 觀察者模式(Observer):定義了一種一對多的關系,讓多個觀察者對象同時監聽某一個主題對象。這個主題對象在狀態發生變化時,會通知所有觀察者對象,使它們能夠自動更新自己。 23種設計模式之

GOF23設計模式觀察模式(observer)

hang 事件監聽器 rgs str arr public pda import lob 一、觀察者模式概述   觀察者模式主要用於 1 :N 的通知。當一個對象(目標對象 Subject 或 Observable)的狀態變化時,它需要通知一系列對象(觀察者對象 Obser

js 設計模式觀察模式

swe 有變 主題 頁面 ESS eache 不能 mov 學生類 觀察者模式 又被稱為“發布-訂閱”模式,目的是解決主題對象和觀察者之間功能的耦合性。發布者和訂閱者之間是互不幹擾的,沒有聯系的,通過觀察者,當做中介,將二者聯系起來。 例子:以學生和老師之間的為例 1.首先

PHP 設計模式觀察模式

通知 更新 一對多 改變 變化 variable 它的 all 正常 觀察者模式定義對象的一對多依賴,這樣一來,當一個對象改變狀態時,它的所有依賴者都會收到通知並自動更新! 設計原則 在觀察者模式中,會改變的是主題的狀態以及觀察者的數目。用這個模式,你可以改變

C++設計模式觀察模式

圖片 .com attach mov pan rtu cts gin pda //觀察者模式 class Observer{ public: virtual void Updata() = 0; }; class Subject{ public: voi

設計模式的藝術 行為型模式觀察模式

前言 紅燈停,綠燈行,在日常的交通中,每每遇到紅燈,司機總是要在路口進行等待,等到綠燈才能通過,這個時候司機就扮演了一個觀察者的角色,隨著燈的顏色的變化,司機的行為也跟著變化,在軟體系統中,有些物件之間也存在類似交通訊號燈和汽車之間的關係,一個物件的的行為狀態改變導致了其他物件的狀態或行為也發生