设计模式-中介者模式(Mediator Pattern)
设计模式-中介者模式(Mediator Pattern)
文章目录
- 设计模式-中介者模式(Mediator Pattern)
- 一、定义
- 二、概念解释
- 三、场景
- 四、实现
- 1、类图
- 2、代码实现
- 五、总结
一、定义
用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,从而使其耦合松散,而且可以独立的改变他们之间的交互。
二、概念解释
可以想象有三个人A、B、C,三人之间互相交谈,A和B、C说话,B和A、C说话,C和A、B说话,相互紧密关联,如果再来一个D,那么A、B、C还得分别去和D产生联系,耦合性太强,如果我加一个中介者,所有的交谈都通过中介者进行传播,其他人只需要把想说的话告诉中介者,中介者去做传递,就大大降低了每个人之间的耦合关系
三、场景
网络游戏相比单机游戏有一个比较大的优势就是网络游戏中玩家之间可以通过聊天窗口进行交谈,这种社交功能会极大提高玩家的游戏积极性,毕竟单排上分注孤生,五黑开车才是快乐真谛,本例子就模拟三个人的聊天窗口,任意一个人说话其余人都可以看到,实现一个简单的中介者模式。
四、实现
1、类图
2、代码实现
首先定义一个抽象聊天中介类
public abstract class ChatMediator {/*** 聊天* @param message 消息* @param player 玩家*/public abstract void chat(String message, Player player);}
定义一个具体的聊天窗口 需要定义所有的同事类以解耦交互行为
@Data
@EqualsAndHashCode(callSuper = false)
public class ChatWindow extends ChatMediator{private ZhangSan zhangSan;private LiSi liSi;private WangWu wangWu;@Overridepublic void chat(String message, Player player) {// 谁发送消息 其余的人就接受消息if (player == zhangSan) {wangWu.getMessage(message);liSi.getMessage(message);}if (player == liSi) {zhangSan.getMessage(message);wangWu.getMessage(message);}if (player == wangWu) {zhangSan.getMessage(message);liSi.getMessage(message);}}}
抽象的同事类
public abstract class Player {protected String name;protected ChatMediator chatMediator;public Player(String name, ChatMediator chatMediator) {this.name = name;this.chatMediator = chatMediator;}}
具体同事类 每个同事类都知道中介者,在与其他同事进行交互时,均通过中介者进行协作
public class ZhangSan extends Player{public ZhangSan(String name, ChatMediator chatMediator) {super(name, chatMediator);}public void chat(String message) {chatMediator.chat(message, this);}public void getMessage(String message) {System.out.println("zhangSan 获取到的消息是" + message);}
}
public class LiSi extends Player{public LiSi(String name, ChatMediator chatMediator) {super(name, chatMediator);}public void chat(String message) {chatMediator.chat(message, this);}public void getMessage(String message) {System.out.println("Lisi 获取到的消息是" + message);}
}
public class WangWu extends Player{public WangWu(String name, ChatMediator chatMediator) {super(name, chatMediator);}public void chat(String message) {chatMediator.chat(message, this);}public void getMessage(String message) {System.out.println("wangWu 获取到的消息是" + message);}
}
任意一人发消息,其余人都可以获取到
@SpringBootTest
public class MediatorTest {@Testpublic void test() {ChatWindow chatWindow = new ChatWindow();ZhangSan zhangSan = new ZhangSan("张三", chatWindow);LiSi liSi = new LiSi("李四", chatWindow);WangWu wangWu = new WangWu("王五", chatWindow);chatWindow.setZhangSan(zhangSan);chatWindow.setLiSi(liSi);chatWindow.setWangWu(wangWu);zhangSan.chat("上线上线");liSi.chat("我上单");wangWu.chat("我打野");}
}
五、总结
优点:如前面所述,减少类间依赖,将一对多关系变为一对一,降低耦合
缺点:这个中介者会随着同事类之间交互方式的增加而不断膨胀,导致其逻辑就会越加复杂
代码地址: https://github.com/LuckyTeemo/design-pattern
设计模式-中介者模式(Mediator Pattern)相关推荐
- 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)
[索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...
- PHP设计模式之中介者模式(Mediator Pattern)了解下
咱们先来看下中介者模式(Mediator Pattern)的定义,它就是,用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互, ...
- java中介者模式例子_Java中介者模式(Mediator Pattern)
本篇文章帮大家学习java中介者模式(Mediator Pattern),包含了Java中介者模式(Mediator Pattern)使用方法.操作技巧.实例演示和注意事项,有一定的学习价值,大家可以 ...
- 设计模式.中介者模式Mediator
定义 中介者模式(Mediator pattern) : 使用中介者模式来集中相关对象之间复杂的沟通和控制方式,使得这些对象不必相互明显引用.从而使它们可以较松散地耦合.当这些对象中的某些对象之间的相 ...
- 7.7 中介者模式(Mediator Pattern)
一. 定义 在现实生活中,常出现多个对象之间存在复杂的交互关系,这种交互关系常常是"网状结构",要求每个对象都必须知道它需要交互的对象.如:每个人必须记住他所有朋友的电话,若朋友中 ...
- [设计模式] 17 中介者模式 Mediator Pattern
在GOF的<设计模式:可复用面向对象软件的基础>一书中对中介者模式是这样说的:用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变 ...
- 设计模式之中介者模式---Mediator Pattern
模式的定义 中介者模式定义如下: Define an object that encapsulates how a set of objects interact.Mediator promotes ...
- 【23种设计模式】中介者模式(Mediator Pattern) .Net Core实现
文章目录 简介 伪代码演示 简单实现 使用MediatR实现中介者模式 来源 简介 中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性.这种模式提供了一个中介类,该类 ...
- 设计模式之中介者模式(Mediator Pattern)
中介者模式定义 Define an object that encapsulates how a set of objects interact. Mediator promotes loose co ...
最新文章
- 噪声与平滑滤波(MATLAB)
- CPU访问计算机各组件周期
- ZOJ 2317	Nice Patterns Strike Back(矩阵快速幂)
- PPT怎么在线转视频?
- VS2017——50G超豪华IDE套餐酸爽体验!
- java实体序列化_java – 在JPA实体序列化(JSON)上防止JAX-RS中...
- 特斯拉股价,真的“血崩”!
- 为什么我 11 岁的儿子说要放弃编程,却又转战 Python
- 修改mysql默认字符集为latin1_修改MYSQL默认编码为UTF8
- 几个负载均衡软件比较(Haproxy vs LVS vs Nginx)
- python飞机大战游戏代码_python实现飞机大战小游戏
- 缺陷分析之缺陷预防的过程
- 之前安装过Multisim14,再次安装失败的解决方法
- 文图片处理技巧——透明块
- 龙芯3A3000编译安装Postgresql12.2
- python爬取豆瓣电影排行榜前250名
- HDU 4939 Stupid Tower Defense 简单DP
- 阿里云国际ECS云服务器免费试用版如何使用?
- iPhone自定义手机铃声完整版教程
- android虚拟按键实现,虚拟按键的实现