镁伽机器人面试算法题 JAVA设计模式?
第一题:JAVA设计模式:
我们需要制作一种火警报警器,它同时拥有烟雾探测功能和声音报警的功能。报警器会被装在一个大楼的各处不同的角落,只要有一个报警器发现了烟雾,他就会通知其他的火警报警器,并一起发出报警的声音。
请使用写一段代码,模拟我们报警器和报警过程:
1.请使用观察者模式使得我们可以不需要修改报警器内的代码就可以安装新的报警器。
2.本题目不需要考虑多线程的场景。
1 个回答
风中传来苦咸,是科学的甜美气息!太极以下是使用观察者模式实现火警报警器的代码,满足题目要求: ### 代码实现 ```java import java.util.ArrayList; import java.util.List; // 报警器接口 interface AlarmListener { void onAlarm(); } // 火警报警器类 class FireAlarm { private List<AlarmListener> listeners = new ArrayList<>(); // 添加监听器(观察者) public void addListener(AlarmListener listener) { listeners.add(listener); } // 移除监听器 public void removeListener(AlarmListener listener) { listeners.remove(listener); } // 触发报警 public void detectSmoke() { System.out.println("烟雾检测到!正在通知所有报警器..."); notifyListeners(); } // 通知所有观察者 private void notifyListeners() { for (AlarmListener listener : listeners) { listener.onAlarm(); } } } // 报警器实现类 class SmokeAlarm implements AlarmListener { private String location; public SmokeAlarm(String location) { this.location = location; } @Override public void onAlarm() { System.out.println("报警器[" + location + "]:发出警报声!"); } } // 测试类 public class FireAlarmTest { public static void main(String[] args) { // 创建主报警器 FireAlarm centralAlarm = new FireAlarm(); // 在不同位置安装报警器 SmokeAlarm alarm1 = new SmokeAlarm("大楼一层"); SmokeAlarm alarm2 = new SmokeAlarm("大楼二层"); SmokeAlarm alarm3 = new SmokeAlarm("大楼三层"); // 将报警器注册到主报警器 centralAlarm.addListener(alarm1); centralAlarm.addListener(alarm2); centralAlarm.addListener(alarm3); // 检测到烟雾,触发报警 centralAlarm.detectSmoke(); } } ``` ### 输出结果 运行代码后,当主报警器检测到烟雾时,所有安装的报警器将被通知并触发报警声: ``` 烟雾检测到!正在通知所有报警器... 报警器[大楼一层]:发出警报声! 报警器[大楼二层]:发出警报声! 报警器[大楼三层]:发出警报声! ``` ### 代码解析 1. **观察者模式实现**: - `FireAlarm` 作为被观察者(Subject)。 - `SmokeAlarm` 实现了 `AlarmListener` 接口,作为观察者(Observer)。 2. **扩展性**: - 新的报警器只需要实现 `AlarmListener` 接口并注册到 `FireAlarm` 即可,不需要修改已有代码。 3. **解耦性**: - `FireAlarm` 和具体的报警器实现解耦,满足开闭原则(对扩展开放,对修改关闭)。发布于 2024-12-08 13:22 •IP属地 江苏举报评论收藏
公众号进入网站体验更佳

