最新要闻
- 孟晚舟:华为让欧拉、鸿蒙等开源 促进国产生态、操作系统繁荣
- 天天视讯!男子被宠物魔鬼鱼刺伤险丧命 专家:鲨鱼同类 含神经毒素
- 世界微动态丨苹果WWDC将发自研xrOS:这导致iOS 17/iPadOS 17更新大幅缩水
- 天天即时看!5.39万起!吉利几何熊猫mini小黄鸭限定版上市:极其可爱
- 【环球新视野】国产车崛起!反超大众成销量第一 比亚迪:为了这两年 准备了二十年
- 【世界新要闻】为适应被查处后生活 一贪官提前吃减肥餐
- 今头条!山东苯乙烯市场行情小幅走低
- 全球热门:已致29人不幸遇难!长峰医院火灾事故伤亡情况、事故原因初步调查结果公布
- 世界热点!100%自主指令集!国产龙芯CPU进驻国家重点工程
- 焦点观察:日本、韩国车企遭重击:美国花式打击 电动汽车补贴无视日/韩系 毫无存在感
- 环球热门:NASA失控卫星将坠落地球自毁 有可能砸伤人:几率比遭雷击高得多
- 当前消息!全国首例 长沙一男子植入戒酒芯片:立即起效 管用5个月
- 比5G好用10倍 华为持续推动5.5G时代建设:万兆网速体验
- 每日观察!中国科学家有望率先在国际上探测到超大质量双黑洞的并合
- 2023年中国兽药行业细分市场分析 生物制品发展向好【组图】
- 天天快资讯:金属机身、独立语音助手!小米Sound Move便携智能音箱图赏
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
【聚看点】【中介者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
(资料图片仅供参考)
简介
中介者模式(Mediator Pattern)是一种行为型模式。它限制对象之间的直接交互,它用一个中介对象来封装一系列的动作,以让对象之间进行交流。中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
当一些对象和其他对象紧密耦合以致难以对其进行修改时,或当组件因过于依赖其他组件而无法在不同应用中复用时,可使用中介者模式。
作用
- 用来降低多个对象和类之间的通信复杂性。
- 对象之间不再显式地相互引用,但可以独立地改变它们之间的交互,从而保持松耦合。
实现步骤
- 定义一个工具接口,供不同工具类来实现。建立多个具体工具类实现基础工具接口。
- 定义一个基础抽象类,里面聚合了工具接口,相当于桥接。
- 再重新定义一个新抽象类,继承自基础抽象类,并补充一些方法。
- 建立具体对象类继承新抽象类,调用桥接接口里的方法来实现功能。
UML
Java代码
中介者抽象接口
// RoomMediator.java 定义中介者接口或抽象类public interface RoomMediator { public void register(AbstractUser user); public void sendTo(AbstractUser from, AbstractUser to, String message); public void send(AbstractUser from, String message);}
通用中介者
// GeneralRoom.java 中介者的具体实现类public class GeneralRoom implements RoomMediator { public Listusers = new ArrayList (); @Override public void register(AbstractUser user) { // 用户注册登记,追加用户列表 user.setRoomMediator(this); users.add(user); } // 作为中介者通知给某个用户 @Override public void sendTo(AbstractUser from, AbstractUser to, String message) { System.out.println( "GeneralRoom:sendTo() [from: " + from.getName() + " message: " + message + " to: " + to.getName() + " ]"); // 根据用户名称定向发送 to.recieve(from, message); } // 作为中介者通知给全体用户 @Override public void send(AbstractUser from, String message) { System.out.println("GeneralRoom:send() [from: " + from.getName() + " message: " + message + "]"); for (AbstractUser user : users) { user.recieve(from, message); } }}
抽象用户类
// AbstractUser.java 定义抽象用户类,聚合中介者public abstract class AbstractUser { private String name; public RoomMediator roomMediator; public AbstractUser(String name) { this.name = name; } public void setRoomMediator(RoomMediator roomMediator) { this.roomMediator = roomMediator; } public abstract void send(String message); public abstract void sendTo(AbstractUser to, String message); public abstract void recieve(AbstractUser from, String message); public String getName() { return this.name; }}
具体用户对象
// CommonUser.java 普通用户继承了抽象用户,实现了具体功能public class CommonUser extends AbstractUser { public CommonUser(String name) { super(name); } @Override public void send(String message) { System.out.println("CommonUser:send() [user: " + this.getName() + " message:" + message + "]"); // 通过中介者来中转消息 this.roomMediator.send(this, message); } @Override public void sendTo(AbstractUser to, String message) { System.out.println("CommonUser:sendTo() [user: " + this.getName() + " message:" + message + " to: " + to.getName() + "]"); // 通过中介者来中转消息 this.roomMediator.sendTo(this, to, message); } @Override public void recieve(AbstractUser from, String message) { System.out.println("CommonUser:recieve() [user: " + this.getName() + " message: " + message + " from:" + from.getName() + "]"); }}
// MemberUser.java 会员用户继承了抽象用户,实现了具体功能public class MemberUser extends AbstractUser { public MemberUser(String name) { super(name); } @Override public void send(String message) { System.out.println("MemberUser:send() [user: " + this.getName() + " message:" + message + "]"); // 通过中介者来中转消息 this.roomMediator.send(this, message); } @Override public void sendTo(AbstractUser to, String message) { System.out .println("MemberUser:sendTo() [user: " + this.getName() + " message:" + message + " to: " + to.getName() + "]"); // 通过中介者来中转消息 this.roomMediator.sendTo(this, to, message); } @Override public void recieve(AbstractUser from, String message) { System.out.println("MemberUser:recieve() [user: " + this.getName() + " message: " + message + " from user:" + from.getName() + "]"); }}
测试调用
public class Test { public static void start() { /** * 中介者模式用一个中介对象来封装一系列动作,让对象之间利用中介者来交流。 * 这里聊天室就是一个中介者,用户和用户之间的消息传递,全部依靠聊天室来完成。 * 先给聊天室注册用户,也给用户绑定上中介者,双方彼此持有关系。 * 中介者的成员之间的消息传递通过中介者来代理传达。 */ // 声明一个聊天室 GeneralRoom generalRoom = new GeneralRoom(); // 给聊天室添加点不同的人 AbstractUser user1 = new CommonUser("user1"); generalRoom.register(user1); CommonUser user2 = new CommonUser("user2"); generalRoom.register(user2); MemberUser user3 = new MemberUser("user3"); generalRoom.register(user3); // user1 发送给全体 user1.send("hi, I"m " + user1.getName() + "."); // user2 发送给 user3 user2.sendTo(user3, "haha."); } public static void main(String[] args) { System.out.println("test start:"); start(); }}
Go代码
中介者抽象接口
// RoomMediator.go 定义中介者接口或抽象类type RoomMediator interface { Register(user AbstractUser) SendTo(from AbstractUser, to AbstractUser, message string) Send(from AbstractUser, message string)}
通用中介者
// GeneralRoom.go 中介者的具体实现类type GeneralRoom struct { users []AbstractUser}func (g *GeneralRoom) Register(user AbstractUser) { // 用户注册登记,追加用户列表 user.SetRoomMediator(g) g.users = append(g.users, user)}// 作为中介者通知给某个用户func (g *GeneralRoom) SendTo(from AbstractUser, to AbstractUser, message string) { fmt.Println("GeneralRoom::SendTo() [from: " + from.GetName() + " message: " + message + " to: " + to.GetName() + "]") // 定向发送给某个用户,名称唯一 to.Recieve(from, message)}// 作为中介者通知给全体用户func (g *GeneralRoom) Send(from AbstractUser, message string) { fmt.Println("GeneralRoom::Send() [from: " + from.GetName() + " message: " + message + "] ") for _, user := range g.users { user.Recieve(from, message) }}
抽象用户类
// AbstractUser.go 定义抽象用户类,聚合中介者type AbstractUser interface { SetRoomMediator(roomMediator RoomMediator) Send(message string) SendTo(to AbstractUser, message string) Recieve(from AbstractUser, message string) GetName() string}
具体用户对象
// CommonUser.go 普通用户继承了抽象用户,实现了具体功能type CommonUser struct { Name string roomMediator RoomMediator}func (c *CommonUser) SetRoomMediator(roomMediator RoomMediator) { c.roomMediator = roomMediator}func (c *CommonUser) Send(message string) { fmt.Println("CommonUser:Send() [user: " + c.GetName() + " message: " + message + "]") // 通过中介者来中转消息 c.roomMediator.Send(c, message)}func (c *CommonUser) SendTo(to AbstractUser, message string) { fmt.Println("CommonUser:SendTo() [user: " + c.GetName() + " message: " + message + "]") // 通过中介者来中转消息 c.roomMediator.SendTo(c, to, message)}func (c *CommonUser) Recieve(from AbstractUser, message string) { fmt.Println("CommonUser:Recieve() [user: " + c.GetName() + " message: " + message + " from: " + from.GetName() + "]")}func (c *CommonUser) SetName(name string) { c.Name = name}func (c *CommonUser) GetName() string { return c.Name}
// MemberUser.go 会员用户继承了抽象用户,实现了具体功能type MemberUser struct { // Name首字母大写以便跨模块访问 Name string roomMediator RoomMediator}func (c *MemberUser) SetRoomMediator(roomMediator RoomMediator) { c.roomMediator = roomMediator}func (c *MemberUser) Send(message string) { fmt.Println("MemberUser:Send() [user: " + c.GetName() + " message: " + message + "]") // 通过中介者来中转消息 c.roomMediator.Send(c, message)}func (c *MemberUser) SendTo(to AbstractUser, message string) { fmt.Println("MemberUser:SendTo() [user: " + c.GetName() + " message: " + message + "]") // 通过中介者来中转消息 c.roomMediator.SendTo(c, to, message)}func (c *MemberUser) Recieve(from AbstractUser, message string) { fmt.Println("MemberUser:Recieve() [user: " + c.GetName() + " message: " + message + " from: " + from.GetName() + "]")}func (c *MemberUser) SetName(name string) { c.Name = name}func (c *MemberUser) GetName() string { return c.Name}
测试调用
func main() { fmt.Println("test start:") /** * 中介者模式用一个中介对象来封装一系列动作,让对象之间利用中介者来交流。 * 这里聊天室就是一个中介者,用户和用户之间的消息传递,全部依靠聊天室来完成。 * 先给聊天室注册用户,也给用户绑定上中介者,双方彼此持有关系。 * 中介者的成员之间的消息传递通过中介者来代理传达。 */ // 声明一个聊天室 var generalRoom = new(src.GeneralRoom) // 给聊天室添加点不同的人 var user1 = &src.CommonUser{ Name: "user1", } generalRoom.Register(user1) var user2 = &src.CommonUser{ Name: "user2", } generalRoom.Register(user2) var user3 = &src.MemberUser{ Name: "user3", } generalRoom.Register(user3) // user1 发送给全体 user1.Send("hi, I"m " + user1.GetName() + ".") // user2 发送给 user3 user2.SendTo(user3, "haha.")}
C语言简版
#include/** * 中介者模式是一种行为型设计模式,它可以用来减少类之间的直接依赖关系, * 将对象之间的通信封装到一个中介者对象中,从而使得各个对象之间的关系更加松散。 * 在中介者模式中,对象之间不再直接相互交互,而是通过中介者来中转消息。 */typedef struct Colleague Colleague;typedef struct Mediator Mediator;// 定义抽象交互对象类struct Colleague{ int id; struct Mediator *mediator; void (*send)(struct Colleague *sender, char *message); void (*send_to)(struct Colleague *sender, Colleague *receiver, char *message); void (*receive)(struct Colleague *receiver, Colleague *sender, char *message);};// 定义中介者类struct Mediator{ struct Colleague **colleagues; int colleagues_length; void (*send)(Colleague *sender, char *message); void (*send_to)(Colleague *sender, Colleague *receiver, char *message);};// 交互对象发送消息void colleague_send(Colleague *sender, char *message){ printf("\r\n colleague_send() [sender->id=%d message=%s]", sender->id, message); Mediator *mediator = sender->mediator; // 由中介者代为转发消息给全体接收者 mediator->send(sender, message);}// 交互对象发送消息void colleague_send_to(Colleague *sender, Colleague *receiver, char *message){ printf("\r\n colleague_send_to() [sender->id=%d receiver->id=%d message=%s]", sender->id, receiver->id, message); Mediator *mediator = sender->mediator; // 由中介者代为转发消息给指定接收者 mediator->send_to(sender, receiver, message);}// 对象接收消息void colleague_receive(Colleague *receiver, Colleague *sender, char *message){ printf("\r\n colleague_receive() [receiver->id=%d send->id=%d message=%s]", receiver->id, sender->id, message);}// 中介者发送消息void mediator_send(Colleague *sender, char *message){ printf("\r\n mediator_send() [sender->id=%d message=%s]", sender->id, message); Colleague *receiver; for (int i = 0; i < sender->mediator->colleagues_length; i++) { // 中介者通知全体接收者 receiver = sender->mediator->colleagues[i]; receiver->receive(receiver, sender, message); }}// 中介者发送消息void mediator_send_to(Colleague *sender, Colleague *receiver, char *message){ // 中介者通知指定接收者 printf("\r\n mediator_send_to() [sender->id=%d receiver->id=%d message=%s]", sender->id, receiver->id, message); receiver->receive(receiver, sender, message);}// 初始化交互对象类void colleague_constructor(Colleague *self, int id){ self->id = id; self->send = colleague_send; self->send_to = colleague_send_to; self->receive = colleague_receive;}// 初始化中介者类void mediator_constructor(Mediator *self, Colleague **colleagues, int colleagues_length){ self->colleagues = colleagues; self->colleagues_length = colleagues_length; // 给每个对象绑定中介者 for (int i = 0; i < self->colleagues_length; i++) { self->colleagues[i]->mediator = self; } self->send = &mediator_send; self->send_to = &mediator_send_to;}// testint main(){ // 初始化具体交互对象a,分别绑定相关函数 Colleague colleague_a; colleague_constructor(&colleague_a, 1); // 初始化具体交互对象b,分别绑定相关函数 Colleague colleague_b; colleague_constructor(&colleague_b, 2); // 定义交互对象数组 Colleague *colleagues[] = {&colleague_a, &colleague_b}; int colleagues_length = sizeof(colleagues) / sizeof(colleagues[0]); printf("colleagues_length=%d", colleagues_length); // 初始化中介者类,绑定交互对象 Mediator mediator; mediator_constructor(&mediator, colleagues, colleagues_length); // 交互类发送消息 colleague_a.send(&colleague_a, "Hi, all! I"m a."); printf("\r\n ==== \r\n"); colleague_a.send_to(&colleague_a, &colleague_b, "Hello, colleague_b. I am a!"); printf("\r\n ==== \r\n"); colleague_b.send_to(&colleague_b, &colleague_a, "Hi, colleague_a! I"m b."); return 0;}
更多语言版本
不同语言实现设计模式:https://github.com/microwind/design-pattern
关键词:
-
【聚看点】【中介者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
*中介者模式是一种行为型设计模式,它可以用来减少类之间的直接依赖关系, *将对象之间的通信封装到一个...
来源: 【聚看点】【中介者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
速递!AIRIOT物联网平台助力油库自动化升级 实现业务场景全覆盖
视焦点讯!md文件图片上传
热点评!第二季度白银价格如何表现?
孟晚舟:华为让欧拉、鸿蒙等开源 促进国产生态、操作系统繁荣
天天视讯!男子被宠物魔鬼鱼刺伤险丧命 专家:鲨鱼同类 含神经毒素
世界微动态丨苹果WWDC将发自研xrOS:这导致iOS 17/iPadOS 17更新大幅缩水
天天即时看!5.39万起!吉利几何熊猫mini小黄鸭限定版上市:极其可爱
【环球新视野】国产车崛起!反超大众成销量第一 比亚迪:为了这两年 准备了二十年
【世界新要闻】为适应被查处后生活 一贪官提前吃减肥餐
今头条!山东苯乙烯市场行情小幅走低
全球播报:day02-功能实现02
消息!Kubesphere部署Ruoyi(一):为什么是Ruoyi和Kubesphere?
今头条!TC (Teamcenter) 许可证解决方案
简讯:Windows 10开发教程_编程入门自学教程_菜鸟教程-免费教程分享
全球热门:已致29人不幸遇难!长峰医院火灾事故伤亡情况、事故原因初步调查结果公布
世界热点!100%自主指令集!国产龙芯CPU进驻国家重点工程
焦点观察:日本、韩国车企遭重击:美国花式打击 电动汽车补贴无视日/韩系 毫无存在感
环球热门:NASA失控卫星将坠落地球自毁 有可能砸伤人:几率比遭雷击高得多
当前消息!全国首例 长沙一男子植入戒酒芯片:立即起效 管用5个月
比5G好用10倍 华为持续推动5.5G时代建设:万兆网速体验
每日观察!中国科学家有望率先在国际上探测到超大质量双黑洞的并合
2023年中国兽药行业细分市场分析 生物制品发展向好【组图】
【Jmeter】基础介绍-详细
每日动态!欢迎页轮播动画
天天快资讯:金属机身、独立语音助手!小米Sound Move便携智能音箱图赏
温和去油不刺激:水密码氨基酸洗面奶9.9元大促
小米看了要报警!用iPhone换新买小米13 Ultra可立省400元
继续领先韩国、日本 我国造船业三大指标均保持世界第一
焦点简讯:VR冒险游戏《苍穹乾坤》:没有32GB内存就别玩了
【焦点热闻】天风证券赵晓光:未来芯片领域将是汽车竞争的主要部分
世界微头条丨上海嘉定电子社保卡如何申请,申请方法如下
全球微速讯:终于把 Spring Boot 3.0 写成书了!
天天热文:CANN开发实践:4个DVPP内存问题的典型案例解读
全球微资讯!vulstack2 靶场做题笔记
每日短讯:今日亚盘外汇技术分析(2023年4月19日)
微速讯:科创板收盘播报:科创50指数涨0.41% 医药医疗股普遍调整
资讯推荐:Nuada机械仿生手套:内置多种传感器可用于辅助诊疗
小米汽车明年量产!雷军现身上海车展参观众车企:蔚来李斌亲自接待
全球信息:科学家在快餐包装中发现PFAS永久化学品:强酸/碱、高温都无法降解
“变性”、打针都改不了的“坏毛病”:人类还要被折磨多久?
全球消息!“发哥”再次雄起!天玑9200+跑分首曝近137万 冠绝安卓
不止封杀老头乐!北京将试点在外卖快递车上加装芯片:实时检测轨迹
天天即时:2023WTT澳门冠军赛:马龙晋级十六强
每日视点!SPSS安装及破解教程
天天微资讯!从申请到调用:全国快递物流查询 API 使用教程
小鹿线怎么样?
全球速读:ESXi主机报错:其他主机硬件对象的状态(System Management Software 1 SEL Fullness)
顶象uni-app版设备指纹上线,满足企业多平台服务需求
每日焦点!黄玉强出任中国平安审计责任人
天天看点:旷视科技联合中盾安信:AI赋能新时代,营造安全可信的数字环境
女子上班6天工资仅发41元:老板以各种理由克扣
【世界独家】工人在线向马斯克求助讨薪:首起特斯拉上海工厂致命生产事故意外曝光
当前观察:iQOO Neo8系列下月发:标准版骁龙8+ Pro版天玑9200+
今日热讯:腾讯发布五一假期未成年人限玩通知:打游戏也要调休
【环球播资讯】认同吗?魅族前高管称5千到1万安卓机不值得冲 网友吵翻就苹果值?
全球消息!在 Linux 上配置一个 syslog 服务器
焦点短讯!一千个需求如何快速排序?MoSCoW排序法用上了!【No.2】
环球观天下!张轩昊丨操作思路分享【4月19日】今日黄金原油操作建议,实盘交易干货分享!
日本政府考虑取消重要人物街头演讲 改为在室内进行
环球观点:机器一样会“过劳死”!一机器人展览会上连续工作20小时后倒下
要完全停用中国造芯片、PC等绝非虚言!戴尔:正专注从中国以外采购零部件
今日热搜:滴滴自动驾驶卡车KargoBot亮相:一位司机同时“开”多辆卡车
全球快报:为什么终面往往是HR面,核心考察候选人的什么能力?
企业工商四要素核验 API:有效应对商业欺诈和恶意交易的利器
每日快看:C#12预览版释出,新功能一览
俄乌总统先后到访冲突前线,俄媒:战事胶着,普京此访释放重要信号
绿茵生态:子公司休闲旅游项目一期已建成落地
天天速递!外卖员身绑树枝挂吊瓶送外卖 网友:致敬每一位努力的人
焦点快报!这看的是电影?北影节一影片票价炒到8000元
世界报道:今年内上市 比亚迪B级纯电猎装SUV宋L获好评:成熟大厂作品
全球报道:2元/支起速囤!小米/usmile/舒客等电动牙刷刷头狂促
天天热推荐:对标小米13 Ultra!真我11 Pro+外观首曝:圆环镜组、绿色素皮后盖
民生直通车|相对生存率提高 监测系统覆盖全国——我国持续完善癌症防治体系
北斗GPS卫星授时系统介绍(时间同步服务器)
python 多线程详解
天天看热讯:云时代,MySQL到ClickHouse数据同步产品对比推荐
全球焦点!MySQL事务实现原理
“格物致知 叩问苍穹”2023年中国航天踏上新征程
世界热头条丨海南房子合适买吗?《滨江商业广场》优势不足全面解读~
世界今头条!小米13 Ultra被抢购一空!雷军:备货非常困难
全球热点!发改委:下大力气稳定汽车消费 鼓励车企开发乡村“专车”
32.88万起售 全新林肯航海家上市:环绕大屏加持如开星际飞船
环球实时:暗光长焦加持!OPPO Reno10 Pro+来了:堪称“小Find X6”
每日快看:误入“小人国”!华为P60 Pro长焦微距效果惊艳
三星7652机身内存是多少?三星7652参数配置
小米2sc是哪一年上市的?小米2sc参数配置
活性水是什么意思?活性水和直饮水的区别是什么?
红眼病是怎么引起的?红眼病的症状有哪些?
三星笔记本NC10显卡怎么下载?三星笔记本nc10显卡配置
天天观察:香港金管局再承接69.16亿港元沽盘?
打不过啊!本赛季老鹰对绿军0胜5负 场均净负13.2分
国家发展改革委:正在抓紧研究起草关于恢复和扩大消费政策文件
快看点丨极端高温出现 印度一颁奖礼热死11人:每人获赔4.1万
热门:开卷!微软拟自研AI芯片“戴安娜”:降低机器学习成本
黑入iPhone仅需一条iMessage消息!多起NSO“零点击”攻击曝光
米粉首发入手小米13 Ultra:实在太香了 小米11 Pro终于退休了
一体成型无拼接:康巴赫整竹双面砧板69元新低(90元券)
环球热消息:安卓微信暗黑模式怎么设置_设置暗黑模式的方法
环球报道:魏牌全面做强大六/七座市场,“蓝山/高山双旗舰组合”闪耀上海车展