中介者模式(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. WTL 9.0的变化 - atlctrls.h

    atlctrls.h中是对控件的封装. 第1249行增加: void GetMargins(UINT& nLeft, UINT& nRight) const { ATLASSERT(: ...

  2. java 多态(向上转型)

    多态的定义与使用格式 多态的定义格式:就是父类的引用变量指向子类对象 父类类型  变量名 = new 子类类型(); 变量名.方法名(); 普通类多态定义的格式 父类 变量名 = new 子类(); ...

  3. hasura graphql-engine + plv8 集成

    hasura graphql-engine 是一款很不错的基于pg 的graphql 引擎,plv8 是pg 的一个扩展,我们可以使用js 编写 函数 ,触发器,而且对于es6 的语法也有比较完备的支 ...

  4. vue : 无法加载文件 C:\Users\xxx\AppData\Roaming\npm\vue.ps1

    最近因为电脑太卡,小颖把电脑重装了,重装后再执行 npm install -g @vue/cli 时可能是网络问题,一直不能成功,小颖就把npm指向了淘宝镜像: npm install -g cnpm ...

  5. vue响应数据的原理

    vue最大的特点就是数据驱动视图. vue的数据改变,页面一定发生改变?不一定. 当操作引用类型的数据,动态添加属性时,页面不会发生改变. vue响应式数据原理(也叫数据绑定原理.双向数据绑定原理): ...

  6. map和object互转的几种方式

    1.使用Apache中的BeanUtils类,导入commons-beanutils包. 2.使用JSON 3.利用java.lang.reflect.Field类完成Obj和Map之间的相互转换 h ...

  7. Python语言基础考察点:python语言基础常见考题(一)

    一.python是静态还是动态类型?是强类型还是弱类型? 1.动态强类型语言(不少人误以为是弱类型) 不要傻傻分不清 2.动态还是静态指的是编译期还是运行期确定类型 3.强类型指的是不会发生隐式类型转 ...

  8. chentos7 编译安装keepalived 1.4.5

    准备工作: 下载源码包,官方网站 下载命令:wget https://www.keepalived.org/software/keepalived-1.4.5.tar.gz 解压tar包,命令: ta ...

  9. WebGPU学习(七):学习“twoCubes”和“instancedCube”示例

    大家好,本文学习Chrome->webgpu-samplers->twoCubes和instancedCube示例. 这两个示例都与"rotatingCube"示例差不 ...

  10. Java 签名验签工具类

    public class SignatureUtil { private static final String CHARSET = "UTF-8"; private static ...