某企业有一火灾预警中心,火警探测器探测到火情信号后,会自动拨号110火警,并发短信给安全生产负责人和总经理。请利用某设计模式实现此情境,要求画出UML类图,并使用Java语言写出源代码,并测试。
时间: 2024-10-11 10:10:39 浏览: 34
可见光与红外的视频火灾探测器设计
这是一个典型的职责链(Chain of Responsibility)设计模式的应用场景。这个设计模式用于将请求处理的责任委托给多个对象,让它们都有机会处理这个请求,直到某个对象能处理为止。
**UML类图**:
- 火警探测器(FireDetector):负责检测火警信号并传递给下一个处理者。
- 报警处理器(AlarmHandler):接口或抽象类,包含处理火警信号的方法。
- 具体实现1:电话报警处理器(PhoneAlarmHandler),拨打电话通知消防中心。
- 具体实现2:短信报警处理器(SMSAlarmHandler),发送短信给相关人员。
- 安全生产负责人(SafetyOfficer)和总经理(CEO):作为特定类型的报警处理器。
```plaintext
+--+
| - nextHandler: AlarmHandler|
+-----------------------+
| + detectFire(): void |
| + passToNext(): void |
+---------+
+------------------------+
| AlarmHandler Interface |
+------------------------+
| + handleAlarm(): boolean|
+------------------------+
+--------------------+
| PhoneAlarmHandler |
+--------------------+
| - (implement handleAlarm())
+--------------------+
| SMSAlarmHandler |
+--------------------+
| - (implement handleAlarm())
| - sendSMS(): void |
+--------------------+
+-------------------+
| SafetyOfficer |
+-------------------+
| - (extend AlarmHandler)
| - receiveAlert() |
+-------------------
+-------------------+
| CEO |
+-------------------+
| - (extend AlarmHandler)
| - receiveAlert() |
+-------------------
```
**Java代码示例**:
```java
// FireDetector.java
public class FireDetector {
private AlarmHandler handler;
public FireDetector(AlarmHandler handler) {
this.handler = handler;
}
public void detectFire() {
if (handler.handleAlarm()) {
return; // 如果已处理则返回
}
handler = handler.getNext(); // 未处理继续传递
detectFire();
}
}
// AlarmHandler.java
public abstract class AlarmHandler {
protected abstract boolean handleAlarm();
protected AlarmHandler getNext() {
return null;
}
}
// PhoneAlarmHandler.java
public class PhoneAlarmHandler extends AlarmHandler {
@Override
public boolean handleAlarm() {
System.out.println("Calling 110...");
return true; // 假设电话报警成功
}
}
// SMSAlarmHandler.java
public class SMSAlarmHandler extends AlarmHandler {
private String recipient;
public SMSAlarmHandler(String recipient) {
this.recipient = recipient;
}
@Override
public boolean handleAlarm() {
System.out.println("Sending SMS to " + recipient);
return false; // 假设短信报警未成功,需要继续传递
}
public void sendSMS() { /* 实现发送短信功能 */ }
}
// 测试
public static void main(String[] args) {
FireDetector detector = new FireDetector(new PhoneAlarmHandler());
detector.detectFire(); // 调用探测器
detector.handler = new SMSAlarmHandler("safety_officer@example.com");
detector.detectFire(); // 现在向短信报警处理器传递
detector.handler = new SMSAlarmHandler("ceo@example.com");
detector.detectFire(); // 最终向CEO发送短信报警
}
```
**测试**:
运行测试代码,首先会尝试拨打110,如果成功则结束;如果没有成功(如模拟电话不通),则会向短信报警处理器传递,并尝试发送短信。如果有多个安全责任人或经理,可以添加更多的`SMSAlarmHandler`实例并调整顺序。
阅读全文