某企业有一火灾预警中心,火警探测器探测到火情信号后,会自动拨号110火警,并发短信给安全生产负责人和总经理。请利用某设计模式实现此情境,要求画出UML类图,并写出源代码,并测试。
时间: 2024-10-17 15:08:59 浏览: 45
这是一个典型的发布订阅(Publish-Subscribe)设计模式的应用场景,也称为观察者模式,当一个主题(如火警探测器)发生变化时,所有订阅该主题的接收者(如报警系统、短信发送服务等)都会得到通知。
首先,我们来画一个简单的UML类图:
```plaintext
+-----------------------+
| Subject (探测器) |
+-----------------------+
| - observers: List<Observer> |
| + notifyObservers() |
+-----------------------+
+-----------------------+
| Observer (报警系统) |
+-----------------------+
| - update(Subject subject) |
+-----------------------+
+-----------------------+
| SMSNotifier (短信服务)|
+-----------------------+
| - sendSMS(String message) |
+-----------------------+
```
在这个类图中,`Subject`代表探测器,它有`observers`列表存储观察者;`Observer`是抽象的,代表可以接收到更新的通知,比如报警系统和短信服务;`SMSNotifier`是一个具体的观察者,负责发送短信。
以下是简化的Java代码实现:
```java
import java.util.ArrayList;
import java.util.List;
// Subject (探测器)
public class FireDetector {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer observer) {
observers.add(observer);
}
// 当检测到火警时调用
public void detectFire() {
for (Observer observer : observers) {
observer.update(this);
}
}
}
// Observer (通用观察者接口)
public interface Observer {
void update(Subject subject);
}
// AlarmSystem (报警系统)
class AlarmSystem implements Observer {
@Override
public void update(FireDetector detector) {
// 发送火警信息到110
callPolice();
}
// 调用实际的报警函数
private void callPolice() {
System.out.println("Alarm system: Notifying fire department.");
}
}
// SMSNotifier (短信服务)
class SMSNotifier implements Observer {
@Override
public void update(FireDetector detector) {
String message = "Fire detected at the company!";
sendSMS(message);
}
// 调用实际的短信发送函数
private void sendSMS(String message) {
System.out.println("Sending SMS to manager and production team: " + message);
}
}
```
测试部分:
```java
public class Main {
public static void main(String[] args) {
FireDetector detector = new FireDetector();
AlarmSystem alarmSystem = new AlarmSystem();
SMSNotifier smsNotifier = new SMSNotifier();
detector.addObserver(alarmSystem);
detector.addObserver(smsNotifier);
// 模拟火警情况
detector.detectFire();
}
}
```
运行这个测试,你会看到报警系统向消防部门发出警告,并且短信服务向经理和生产团队发送火警消息。
阅读全文