觀察者模式
一、題目:
某公司欲開發一套機房監控系統,如果機房達到一定指定溫度,傳感器將作出反應,將信號傳遞給響應設備,如警示燈將閃爍,報警器將發出警報,安全逃生門將自動開啓、隔熱門將自動關閉,每一響應設備的行爲右專門的程序來控制,爲支持將來引入新類型的響應設備,用觀察者模式設計該系統
(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();
}
}
五、運行結果: