設計模式練習(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();
    }
}

五、運行結果:

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章