中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。想象一个乱糟糟的开发小组的工作状态,组员之间虽然在一起协同工作,但是意见难以统一,总是相互指挥,导致工作进度滞后。这时候,就需要一个仲裁者。所有的组员将自己的情况汇报给仲裁者,仲裁者会从团队的整体考虑,然后下达指令。仲裁者负责统一大家的意见。这样,团队的交流过程就变成了组员向仲裁者报告,仲裁者向组员下达指令的形式,而组员之间不再询问和沟通,这就是Mediator模式。

本文根据https://blog.csdn.net/niunai112/article/details/79913833所给的实例,用Matlab语言实现中介者模式

Mediator.m (抽象的中介者类)

classdef Mediator < handle
properties
userlist = User.empty();
end
methods(Abstract)
sendToAll(~,~);
sendToPerson(~,~,~);
join(~,~);
leave(~,~);
end
end

ChatPlatform.m (具体的中介者类,ConcreteMediator)

classdef ChatPlatform < Mediator
methods
function sendToAll(obj,msg)
for i=1:length(obj.userlist)
obj.userlist(i).accept(msg);
end
end
function sendToPerson(obj,name,msg)
user = obj.userlist([obj.userlist.name] == name);
for i = 1:length(user)
user.accept(msg);
end
end
function join(obj,user)
obj.userlist(end + 1) = user;
end
function leave(obj,user)
obj.userlist = obj.userlist(obj.userlist ~= user);
end
end
end

User.m (抽象的同事类, Colleague)

classdef User < handle & matlab.mixin.Heterogeneous
properties
mediator
name
end methods
function obj = User(name, mediator)
obj.name = name;
obj.mediator = mediator;
end
function sendToAll(obj,msg)
obj.mediator.sendToAll(msg);
end
function sendToPerson(obj,name,msg)
obj.mediator.sendToPerson(name,msg);
end
function join(obj)
obj.mediator.join(obj);
end
function leave(obj)
obj.mediator.leave(obj);
end
end
methods(Abstract)
accept(~,~);
end
end

NormalUser.m (具体的同事类, ConcreteColleague)

classdef NormalUser < User
methods
function obj = NormalUser(name, mediator)
obj = obj@User(name, mediator);
end
function accept(obj,msg)
disp("[" + datestr(now) + "]" + obj.name + " accepted msg: " + msg);
end
end
end

测试代码:

chatPlatform = ChatPlatform();
a = NormalUser("A", chatPlatform);
b = NormalUser("B", chatPlatform);
c = NormalUser("C", chatPlatform);
a.join();
b.join();
c.join();
disp("-----------------A群发送消息------------------");
a.sendToAll("A:大家听得到吗?");
disp("-----------------A给B私发消息------------------");
a.sendToPerson("B", "A:B,我只想和你说");
disp("-----------------B给A私发消息------------------");
b.sendToPerson("A","B:可以,请说" );
disp("-----------------A离开聊天室------------------");
a.leave();
disp("-----------------B群发送消息------------------");
b.sendToAll("B:A能听到吗");

参考资料

https://www.runoob.com/design-pattern/mediator-pattern.html
https://blog.csdn.net/qq_39384184/article/details/80631275

https://blog.csdn.net/niunai112/article/details/79913833

Matlab中介者模式的更多相关文章

  1. 23种设计模式--中介者模式-Mediator Pattern

    一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...

  2. MediatorPattern(中介者模式)

    /** * 中介者模式 * @author TMAC-J * 研究了这么多设计模式,觉得无非就是几点: * 1.若两个类有耦合关系,设立一个中间类,处理两个类的关系,把两个类的耦合降低 * 2.面向接 ...

  3. C#设计模式-中介者模式

    在现实生活中,有很多中介者模式的身影,例如QQ游戏平台,聊天室.QQ群和短信平台,这些都是中介者模式在现实生活中的应用,下面就具体分享下我对中介者模式的理解. 一. 中介者(Mediator)模式 从 ...

  4. php实现设计模式之 中介者模式

    <?php /* * 中介者模式:用一个中介对象来封装一系列的对象交互,使各对象不需要显式地相互引用从而使其耦合松散,而且可以独立地改变它们之间的交互 */ /* * 以一个同学qq群为例说明, ...

  5. 轻松掌握:JavaScript代理模式、中介者模式

    代理模式.中介者模式 代理模式 在面向对象设计中,有一个单一职责原则,指就一个类(对象.函数)而言,应该仅有一个引起它变化的原因.如果一个对象承担了过多的职责,就意味着它将变得巨大,引起它变化的原因就 ...

  6. java设计模式之中介者模式

    中介者模式 用一个中介对象来封装一系列的对象交互.中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式UML图 中介者模式代码 package com ...

  7. 中介者模式(Mediator Pattern)

    定义一个中介对象来封装系列对象之间的交互.中介者使各个对象不需要显示地相互引用,从而使其耦合性松散,而且可以独立地改变他们之间的交互. Mediator:中介者接口.在里面定义了各个同事之间相互交互所 ...

  8. C++设计模式-Mediator中介者模式

    Mediator中介者模式作用:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. UML如下: Colleage抽象同事类 ...

  9. JAVA 设计模式 中介者模式

    用途 中介者模式 (Mediator) 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 中介者模式是一种行为型模式. 结 ...

随机推荐

  1. AcWing 24. 机器人的运动范围

    习题地址 https://www.acwing.com/solution/acwing/content/2970/ 题目描述地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼ ...

  2. 08-cmake语法-set()

    CMake的基本数据类型是字符串,一组字符串在一起称为列表(list) 用于设置变量. set(VAR a b c) # 输出 VAR = a;b;c VAR 就是一个list 参考: https:/ ...

  3. VIJOS-P1066 弱弱的战壕

    JDOJ 1247: VIJOS-P1066 弱弱的战壕 题目传送门 Description 永恒和mx正在玩一个即时战略游戏,名字嘛~~~~~~恕本人记性不好,忘了--b. mx在他的基地附近建立了 ...

  4. [RN]react-native-scrollable-tab-view和FlatList手势冲突解决

    问题描述: react-native-scrollable-tab-view叠加react-native-scrollable-tab-view再加上FlatList FlatList向下拉时,会造成 ...

  5. 基环树DP

    基环树DP Page1:问题 啥是基环树?就是在一棵树上增加一条边. Page2:基环树的几种情况 无向 有向:基环外向树,基环内向树. Page3:处理问题的基本方式 1.断环成树 2.分别处理树和 ...

  6. NOIp初赛题目整理

    NOIp初赛题目整理 这个 blog 用来整理扶苏准备第一轮 csp 时所做的与 csp 没 有 关 系 的历年 noip-J/S 初赛题目,记录了一些我从不知道的细碎知识点,还有一些憨憨题目,不定期 ...

  7. PATA1031 Hello World for U

    参考代码: #include <cstdio> #include <cstring> int main() { char str[100], ans[40][40]; scan ...

  8. ZROI 暑期高端峰会 A班 Day3 图论

    最短路 NOI2019 D2T1 弹跳 KD 树 线段树套set -> 线段树套并查集? POI2014/2015 ??? \(n\) 个点 \(m\) 条边 DAG.求删掉每个点后 \(1\) ...

  9. python 使用nmap 模块

    官网 https://pypi.org/project/python-nmap/ >>> import nmap>>> nm = nmap.PortScannerS ...

  10. SpringMVC拦截器与SpringBoot自定义拦截器

    首先我们先回顾一下传统拦截器的写法: 第一步创建一个类实现HandlerInterceptor接口,重写接口的方法. 第二步在XML中进行如下配置,就可以实现自定义拦截器了 SpringBoot实现自 ...