1. 程式人生 > >設計模式練習(17)——觀察者模式

設計模式練習(17)——觀察者模式

觀察者模式

一、題目:

某公司欲開發一套機房監控系統,如果機房達到一定指定溫度,感測器將作出反應,將訊號傳遞給響應裝置,如警示燈將閃爍,報警器將發出警報,安全逃生門將自動開啟、隔熱門將自動關閉,每一響應裝置的行為右專門的程式來控制,為支援將來引入新型別的響應裝置,用觀察者模式設計該系統
(1)繪製觀察者模式結構檢視
(2)給出例項類圖並實現程式碼

二、所用模式結構檢視:

這裡寫圖片描述

三、例項類圖:

這裡寫圖片描述

四、例項實現程式碼:

(因為區分,所以在類的前面加了Gj19)

警報危機監測

package gjObserverPattern;

/**
 * 警報危機監測
 * 
 * @author
gong * */
public interface Gj19AlarmListener { public void doSomeThing();//警示燈將閃爍,報警器將發出警報,安全逃生門將自動開啟、隔熱門將自動關閉 }

警示燈

package gjObserverPattern;

/**
 * 警示燈
 * @author gong
 *
 */
public class Gj19Light implements Gj19AlarmListener{


    @Override
    public void doSomeThing() {
        light();
    }

    public
void light(){ System.out.println("警示燈閃爍....."); } }

報警器

package gjObserverPattern;

/**
 * 報警器
 * @author gong
 *
 */
public class Gj19Voice implements Gj19AlarmListener{

    @Override
    public void doSomeThing() {
        alarm();
    }

    public void alarm(){
        System.out.println("報警器發出警報...."
); } }

安全門

package gjObserverPattern;

/**
 * 安全門
 * @author gong
 *
 */
public class Gj19Security implements Gj19AlarmListener{



    @Override
    public void doSomeThing() {
        open();
    }

    public void open(){
        System.out.println("安全逃生門將自動開啟.....");
    }
}

隔熱門

package gjObserverPattern;

/**
 * 隔熱門
 * @author gong
 *
 */
public class Gj19InsulatedDoor implements Gj19AlarmListener{

    @Override
    public void doSomeThing() {
        close();
    }
    public void close(){
        System.out.println("隔熱門將自動關閉....");
    }
}

感測器

package gjObserverPattern;

import java.util.ArrayList;
/**
 * 感測器
 * @author gong
 */
public class Gj19Sensor {

    private double tem;
    private ArrayList<Gj19AlarmListener> alarmListeners = new ArrayList<Gj19AlarmListener>();

    public void add(Gj19AlarmListener lisenter){
        this.alarmListeners.add(lisenter);
    }

    public void remove(Gj19AlarmListener lisenter){
        this.alarmListeners.remove(lisenter);
    }

    public void testAlarm(){
        for(Gj19AlarmListener obj : alarmListeners){
            obj.doSomeThing();
        }
    }

    public void setTem(double tem){
        this.tem = tem;
    }

    public void sendMessage(){
        if(this.tem>40.0){
            testAlarm();
        }else{
            System.out.println("=========正常工作===========");
        }
    }
}

觀察者模式客戶端

package gjObserverPattern;
/**
 * 觀察者模式客戶端
 * @author gong
 *
 */
public class Client {
    public static void main(String[] args) {
        System.out.println("==========機房監控系統開啟=========");

        Gj19Voice Voice = new Gj19Voice();
        Gj19InsulatedDoor InsulatedDoor = new Gj19InsulatedDoor();
        Gj19Light Light = new Gj19Light();
        Gj19Security SecrurityDoor = new Gj19Security();
        //感測器
        Gj19Sensor gj19Sensor = new Gj19Sensor();
        //新增裝置
        gj19Sensor.add(SecrurityDoor);
        gj19Sensor.add(Light);
        gj19Sensor.add(InsulatedDoor);
        gj19Sensor.add(Voice);
        //響應
        gj19Sensor.setTem(30.0);
        gj19Sensor.sendMessage();
        System.out.println("\n\n=============溫度過高, 使系統出現故障============");
        gj19Sensor.setTem(50.0);
        gj19Sensor.sendMessage();
    }
}

五、執行結果:

這裡寫圖片描述

相關推薦

設計模式練習17——觀察模式

觀察者模式 一、題目: 某公司欲開發一套機房監控系統,如果機房達到一定指定溫度,感測器將作出反應,將訊號傳遞給響應裝置,如警示燈將閃爍,報警器將發出警報,安全逃生門將自動開啟、隔熱門將自動關閉,每一響應裝置的行為右專門的程式來控制,為支援將來引入新型別的響

設計模式學習觀察模式C#

original pan 學習筆記 pri 接口 program date contain 兩個 《深入淺出設計模式》學習筆記第二章 需求: 開發一套氣象監測應用,如圖: 氣象站,目前有三種裝置,溫度、濕度和氣壓感應裝置。 WeatherData對象追蹤氣象站的數據,並更

設計模式練習15——中介模式

中介者模式 一、題目: 某軟體公司需要開發一套圖形使用者介面類庫,該類庫包含若干個預定義的窗格物件,例如TextPane,ListPane,GraphicPane,視窗之間不允許直接呼叫,具有該類庫的應用由一個包含一組窗格的視窗(Window)組成,視窗需

Head First設計模式觀察模式

通過具體實現一個氣象監測系統來理解觀察者模式此係統的三個部分是氣象站(獲取實際氣象資料的物理裝置)、WeatherData物件(追蹤來自氣象站的資料,並更新佈告板)和佈告板(顯示目前天氣狀況給使用者看)。 具體來說該應用需要:利用WeatherDate物件從氣象站取得資料,

設計模式觀察模式

針對 ray 需求 als bool 模式 null rri 主動 觀察者模式 定義了對象之間的一對多的依賴,這樣一來,當一個對象狀態改變時,他的 多有依賴都會受到通知並自動更新。 本例為一個溫度基站,和三個終端。溫度基站為廣播類WeatherData,三個終端監聽者類分別

設計模式—— 觀察模式

pda 發出 dex obs index observe target 獲取 委托事件 觀察者模式類似出版社與訂閱者的關系,訂閱者能夠收到出版社發出的消息,可以取消訂閱。出版社在觀察者模式中稱為主題(Subject)訂閱者稱為觀察者(Observer)。 主

設計模式18觀察模式

模式介紹 觀察者模式試圖允許物件在其內部狀態改變時通知觀察者。 這意味著單個物件需要知道觀察它的物件,並且當狀態發生變化的時候,需要能夠與那些觀察者通訊。此外,觀察者應該被自動通知。 示例 設想我們需要一個系統來建模本地蔬菜市場中蔬菜價格的波動。 我們需要允許餐館檢視價格,並在特定蔬菜的價格低於指定閾

一看就懂【來自英雄聯盟蓋倫的怒吼】與 Python 詳解設計模式觀察模式

觀察者模式概述 觀察者模式(有時又被稱為模型-檢視(View)模式、源-收聽者(Listener)模式或從屬者模式)是軟體設計模式的一種。在此種模式中,一個目標物件管理所有相依於它的觀察者物件,並且在它本身的狀態改變時主動發出通知。這通常透過呼叫各觀察者所提供的方法來實現。此種模式通常被用來實現事件處理系統

PHP設計模式5—— 觀察模式

基本概念 整個觀察者模式,其實做的就是監聽事件、處理事件。 由此引出兩個角色,一個是觀察者Listener,另一個是事件處理者Handler。 例子 第一步,建立抽象事件類。 它的主要作用是提供兩個方法給具體事件類呼叫。 abstract clas

設計模式觀察模式

繼續設計模式的文章,今天給大家帶來觀察者模式。先來看看觀察者模式的定義:定義了物件之間的一對多的依賴,這樣一來,當一個物件改變時,它的所有的依賴者都會收到通知並自動更新。好了,對於定義的理解總是需要例項來解析的,如今的微信服務號相當火啊,下面就以微信服務號為背景,給大家介紹

Java設計模式4--觀察模式

今天看了一下觀察者模式,總體來說不難,關鍵是要知道原理和這個模式的用法下面是我自己個人一些理解。 1、定義 觀察者模式,首先得有觀察者,一個或者多個觀察者,它們都依賴於另一個物件,也就是說,這些觀察者都觀察著一個被觀察者。那麼,當被觀察者狀態發生改變

Unity遊戲設計模式觀察模式Observer Pattern

        最近看遊戲設計模式,當看到觀察者模式時被搞得雲裡霧裡的,什麼觀察者,被觀察者,抽象觀察者,抽象被觀察者。聽著這些詞就覺得可怕,其實理解以後還是比較簡單的。         當我們玩遊戲時,經常會出現一些事件,而這個事件可能會影響到許多個模組時就可以用到觀察者

Head First 設計模式觀察模式

觀察者模式 定義 首先看下觀察者模式的定義 觀察者模式定義了物件之間的一對多依賴,這樣一來,當一個物件改變狀態時,它的所有依賴者都會收到通知並自動更新 按我自己的理解翻譯就是: 觀察者模式就是一個主題和多個依賴者的關係,當主題發生變化

java設計模式1觀察模式

說到java觀察者模式 簡單點一個例子就是 被觀測方通過提供註冊介面,使得觀測方能夠通過註冊使得自己實時掌握被觀測方資料變化。 好了 接下來是程式碼 被觀測目標的介面,繼承這個類的目標天生自帶 拉人 踢人技能。只有被邀請的人才能看 1.subject.ava pac

Java 設計模式觀察模式

一、定義 觀察者模式定義了一個一對多的依賴關係,讓多個觀察者物件同時監聽同一個主題物件。當這個主題狀態發生改變時,會通知所有觀察者物件,讓它們自動更新自己。 二、類似場景 聊天室程式的建立。伺服器建立好後,A、B、C三個客戶端連線好公開聊天。A向

設計模式-觀察模式、C#委託、事件

書中引出的例子為,當Boss回來,前臺通知員工好好工作的場景。1、觀察模式將通知廣播給每一個客戶端,客戶端想知道目標的變化a、從目標拉取 b、通知的時候將變化傳遞給客戶端。拉取的方法,客戶端自由度較高,客戶端可以根據需求拉取。觀察者通知內容豐富,客戶端需要不要更新拉取變化。耦

設計模式解密6 - 建造模式

簡單的 對比 ide nbsp blog art 是把 部分 shp 1、簡介 定義:將一個復雜對象的構建與它的表示分離,使得同樣的構建過程可以創建不同的表示。 英文:Builder 類型:創建類模式 2、原理及組成 引:類圖 四個要素 產品類:

設計模式——裝飾模式Decorator Pattern

    裝飾者模式:動態將責任附加到物件上,要拓展功能,提供了比繼承更有彈性的方案。 很多文章也是拿了書上的例子來講,同時寫到,有的調料裝飾者都必須實現 getDescription() 大家可以先考慮下,稍後我們會說。最後都是沒說,還有思考的

《JavaScript設計模式與開發實踐》模式11—— 中介模式

中介者模式的作用就是解除物件與物件之間的緊耦合關係。增加一箇中介者物件後,所有的 相關物件都通過中介者物件來通訊,而不是互相引用,所以當一個物件發生改變時,只需要通知 中介者物件即可。中介者使各物件之間耦合鬆散,而且可以獨立地改變它們之間的互動。中介者模式使網狀的多對多關係變成了相對簡單的一對多關係

《JavaScript設計模式與開發實踐》模式12—— 裝飾模式

在傳統的面嚮物件語言中,給物件新增功能常常使用繼承的方式,但是繼承的方式並不靈活, 還會帶來許多問題:一方面會導致超類和子類之間存在強耦合性,當超類改變時,子類也會隨之 改變;另一方面,繼承這種功能複用方式通常被稱為“白箱複用”,“白箱”是相對可見性而言的, 在繼承方式中,超類的內部細節是對子類可見的,