您的位置:首页 > 其它

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

2017-01-20 16:05 393 查看

观察者模式

一、题目:

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

(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();
}
}


五、运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息