设计模式练习(17)——观察者模式

观察者模式

一、题目:

某公司欲开发一套机房监控系统,如果机房达到一定指定温度,传感器将作出反应,将信号传递给响应设备,如警示灯将闪烁,报警器将发出警报,安全逃生门将自动开启、隔热门将自动关闭,每一响应设备的行为右专门的程序来控制,为支持将来引入新类型的响应设备,用观察者模式设计该系统
(1)绘制观察者模式结构视图
(2)给出实例类图并实现代码

二、所用模式结构视图:

设计模式练习(17)——观察者模式_第1张图片

三、实例类图:

设计模式练习(17)——观察者模式_第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 alarmListeners = new ArrayList();

    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)——观察者模式_第3张图片

你可能感兴趣的:(设计模式)