设计模式:中介者模式代码案例

embedded/2024/10/18 3:24:12/

文章目录

    • 示例1
      • 示例代码
    • 示例2
      • 示例代码

示例1

一个智能家居控制系统。在这个系统中,我们有多个设备,如灯光、窗帘、空调等,它们之间需要相互协作以达到智能控制的目的。例如,当我们说“晚安”时,系统需要关闭灯光、拉上窗帘、调整空调到适宜的温度。在这个场景中,中介者(智能家居控制中心)就是协调各个设备之间交互的核心。

示例代码

首先,我们定义设备的接口和几个具体的设备类:

java">interface SmartDevice {void operateDevice(String command, Mediator mediator);
}class Light implements SmartDevice {@Overridepublic void operateDevice(String command, Mediator mediator) {System.out.println("Light " + command);mediator.notifyDevices(this, command);}
}class Curtain implements SmartDevice {@Overridepublic void operateDevice(String command, Mediator mediator) {System.out.println("Curtain " + command);mediator.notifyDevices(this, command);}
}class AirConditioner implements SmartDevice {@Overridepublic void operateDevice(String command, Mediator mediator) {System.out.println("AirConditioner " + command);mediator.notifyDevices(this, command);}
}

接下来,我们定义中介者接口和具体的中介者实现:

java">interface Mediator {void addDevice(SmartDevice device);void notifyDevices(String command);
}class SmartHomeMediator implements Mediator {private List<SmartDevice> devices = new ArrayList<>();@Overridepublic void addDevice(SmartDevice device) {devices.add(device);}@Overridepublic void notifyDevices(String command) {for (SmartDevice device : devices) {device.operateDevice(command, this);}}
}

最后,我们通过客户端代码来演示智能家居系统的工作流程:

java">public class SmartHomeDemo {public static void main(String[] args) {Mediator mediator = new SmartHomeMediator();SmartDevice light = new Light();SmartDevice curtain = new Curtain();SmartDevice airConditioner = new AirConditioner();mediator.addDevice(light);mediator.addDevice(curtain);mediator.addDevice(airConditioner);// 通过中介者统一控制,模拟“晚安”场景System.out.println("Activating Goodnight Scene:");mediator.notifyDevices("OFF");}
}

示例2

在这个例子中,SmartHomeMediator是中介者,它知道如何协调各个智能设备之间的交互。当我们对灯光说“晚安”(即关闭灯光)时,中介者可以根据预设的场景,通知窗帘拉上、空调调节到适宜的温度等,从而达到智能控制的效果。

中介者模式可以类比为日常生活中的航空交通管制中心(ATC)。在一个繁忙的机场,有许多飞机需要起飞、降落、滑行和等待,如果每架飞机直接与其他飞机沟通,情况会变得异常复杂且危险。航空交通管制中心作为中介者,协调所有飞机的动作,确保安全和有效的运营。

示例代码

首先,我们定义飞机的接口和具体的飞机类:

java">interface Aircraft {void send(String message);void receive(String message);
}class Airplane implements Aircraft {private AirTrafficControlMediator atcMediator;private String flightNumber;public Airplane(AirTrafficControlMediator atc, String flightNumber) {this.atcMediator = atc;this.flightNumber = flightNumber;}@Overridepublic void send(String message) {System.out.println("Flight " + flightNumber + " sending message: " + message);atcMediator.sendMessage(message, this);}@Overridepublic void receive(String message) {System.out.println("Flight " + flightNumber + " received message: " + message);}
}

接下来,我们定义中介者接口和具体的中介者实现:

java">interface AirTrafficControlMediator {void sendMessage(String message, Aircraft aircraft);void addAircraft(Aircraft aircraft);
}class AirTrafficControlCenter implements AirTrafficControlMediator {private List<Aircraft> aircrafts = new ArrayList<>();@Overridepublic void addAircraft(Aircraft aircraft) {aircrafts.add(aircraft);}@Overridepublic void sendMessage(String message, Aircraft originAircraft) {for (Aircraft aircraft : aircrafts) {// 飞机不接收自己发送的消息if (aircraft != originAircraft) {aircraft.receive(message);}}}
}

最后,我们通过客户端代码来演示航空交通管制中心的工作流程:

java">public class AirTrafficControlDemo {public static void main(String[] args) {AirTrafficControlMediator atcMediator = new AirTrafficControlCenter();Aircraft flight1 = new Airplane(atcMediator, "AC159");Aircraft flight2 = new Airplane(atcMediator, "DL120");Aircraft flight3 = new Airplane(atcMediator, "UA993");atcMediator.addAircraft(flight1);atcMediator.addAircraft(flight2);atcMediator.addAircraft(flight3);// 模拟飞机间的通信flight1.send("Ascending to 30,000 ft.");flight2.send("Descending to 10,000 ft.");flight3.send("Requesting permission to land.");}
}

在这个例子中,AirTrafficControlCenter是中介者,它知道如何协调各个飞机之间的交流。每架飞机通过航空交通管制中心来发送和接收消息,而不是直接与其他飞机通信,这样减少了飞机之间的直接依赖,提高了系统的安全性和效率。


http://www.ppmy.cn/embedded/4038.html

相关文章

Ubuntu的用户、组、权限(ACL)管理

目录 用户创建用户删除用户查看(非系统)用户 组查看所有组创建组删除组改变用户所在组从组中移除用户将用户追加到其他组 id查看用户以及所属组名字和id查看用户id查看所属组查看所属组id查看所属组名字 查看有效用户组(主组)查看有效用户组(主组)id查看有效用户组(主族)名字 权…

力扣HOT100 - 142. 环形链表 II

解题思路&#xff1a; public class Solution {public ListNode detectCycle(ListNode head) {Set<ListNode> set new HashSet<>();while (head ! null) {if (!set.add(head)) {return head;}head head.next;}return null;} }

安全特低电压 SELV(Safety Extra Low Voltage,缩写SELV) 是不接地系统的安全特低电压

SELV LED驱动器 市场上有很多LED灯是非隔离的&#xff0c;甚至还有灯条要100多伏特电压才能点亮的&#xff0c;安全吗&#xff1f; 国外多数LED驱动器标注了SELV&#xff0c;为什么&#xff1f; 安全特低电压 SELV(Safety Extra Low Voltage&#xff0c;缩写SELV) 是不接地系…

基于YOLOv5s的电动车入梯识别系统(数据集+权重+登录界面+GUI界面+mysql)

目录 1.UI界面 2.注册登录 3.算法准确率 4.数据集 1.UI界面 本人训练的yolov5s模型&#xff0c;准确率在98.6%左右&#xff0c;可准确完成电梯内检测电动车任务&#xff0c;并搭配了GUI检测界面&#xff0c;支持权重选择、图片检测、视频检测、摄像头检测、识别结果拍照…

基于springboot的工程教育认证的计算机课程管理平台源码数据库

基于springboot的工程教育认证的计算机课程管理平台源码数据库 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于工程教育认证的计算机课程管理平台的开发全过程。通过分析基于工程教育认证的计算机课程管…

Dockeri不运行容器或容器启动不起来,但需要进入容器内执行命令或修改文件

废话不多说&#xff0c;看我这个文章就能解决问题&#xff1a; 1.先删除容器 2.执行命令 docker run --rm -it --entrypoint/bin/bash 镜像名称 例如&#xff1a;进入mysql镜像 docker run --rm -it --entrypoint/bin/bash mysql:last

CSRF

什么是CSRF&#xff1f; csrf中文名称是跨站请求伪造听起来好像和xss&#xff08;跨站脚本攻击&#xff09;差不多&#xff0c;但实际上差别很大 csrf是伪造成该网站的信任用户来进行非法访问 而xss是直接通过js代码进行非法输入来获取用户的具体信息比如&#xff1a;cookie …

【动态规划】C++简单多状态dp问题(打家劫舍、粉刷房子、买卖股票的最佳时机...)

文章目录 前言1. 前言 - 理解动态规划算法2. 关于 简单多状态的dp问题2.5 例题按摩师/打家劫舍 3. 算法题3.1_打家劫舍II3.2_删除并获得点数3.3_粉刷房子3.4_买卖股票的最佳时机含冷冻期3.5_买卖股票的最佳时机含手续费3.6_买卖股票的最佳时机III3.7_买卖股票的最佳时机IV 前言…