设计模式之第19章-中介者模式(Java实现)
“测试妹纸找你,你的代码出问题了。”“美工妹纸让你看看界面怎么样。”身为程序员总要和各种人打交道,但是如果再分为前端、后端工程师的话,那么关系就会错综复杂起来了,这个时候如果有中介者进行中转,类似于星型网络拓扑的交换机,那么该有多好。(PS:注孤生啊,和测试妹纸、美工妹纸什么的一起讨论增进感情多好,那么好的机会都不珍惜。编者按:我是要做那个中介者,懂么?中介者!众人:good job!)“鱼哥,叫我干嘛?”真是说曹操曹操到,刚刚正说你来着,行了,你来说吧。
中介者模式之自我介绍
我乃传说中的中介者,又名“Mediator”,定义如下:Define an object that encapsulates how a set of objects interact.Mediator promotes loose coupling by keeping objects from referring to each other explicitly, and it lets you vary their interaction independently.翻译为:用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。通用类图如下:
中介者模式之自我分析
都说到这个份上了,自然也要简单的分析一下自己:
优势:
- 减少了子类的生成。这样各个Colleague类可以被重用。
- 将各个Colleague进行解耦。这样的话,就可以独立的改变和复用各种Colleague和Mediator类。
- 简化了对象协议。使得Mediator和各个Colleague一对多交互,把关系进行简化,有利于理解维护和扩展。
- 对对象如何协作进行了抽象,有助于理解一个系统中各个对象如何交互。
劣势:
- 使控制集中化,所以中介者会比较复杂,然后使得中介者变得难于维护。
中介者模式之实现
实现嘛,既然你们要看,那我就拿一个Team的个别部分做一个Demo吧。首先我有一个抽象同事类,要和你谈谈:
1 public abstract class AbstractColleague{ 2 protected AbstractMediator mediator; 3 public AbstractColleague(AbstractMediator mediator){ 4 this.mediator = mediator; 5 } 6 }
接下来就是程序员的具体实现类了,其中有三个方法,,两个是自己执行的方法,一个是美工妹纸的任务,通过中介者交给美工妹纸做:

1 public class Programmer extends AbstractColleague{ 2 public Programmer(AbstractMediator mediator){ 3 super(mediator); 4 } 5 //美工妹纸的任务,通过中介者交给美工 6 public void notifyifyUIer(){ 7 System.out.println("告诉美工妹纸帮忙美化界面"); 8 super.mediator.beautifyUI(); 9 } 10 11 public void code(){ 12 System.out.println("写程序,开发"); 13 } 14 15 public void view(){ 16 System.out.println("看看界面如何"); 17 } 18 }
然后是美工妹纸的具体实现类,一个是自己的工作,一个是程序员的事儿,通过中介交给程序员:

1 public class UIer extends AbstractColleague{ 2 public UIer(AbstractMediator mediator){ 3 super(mediator); 4 } 5 6 //程序员的任务,通过中介者交给程序员 7 public void notifyProgrammer(){ 8 System.out.println("让程序员看看界面"); 9 super.mediator.view(); 10 } 11 12 public void beautifyUI(){ 13 System.out.println("美化界面"); 14 } 15 }
接下来就是重头戏,压轴,也就是说抽象中介者抽象类的实现:
1 public abstract class AbstractMediator{ 2 //程序员 3 protected Programmer programmer; 4 //UI妹纸 5 protected UIer ui; 6 //构造函数 7 //set、get方法,此处略去 8 9 //鱼哥用来处理多个对象间的关系 10 public abstract void beautifyUI(); 11 public abstract void view(); 12 13 }
最后是中介类的具体实现:
1 public class Mediator extends AbstractMediator{ 2 //鱼哥的协调策略 3 public abstract void beautifyUI(){ 4 super.ui.beautifyUI(); 5 } 6 public abstract void view(){ 7 super.programer.view(); 8 } 9 }
到此,一个中介者模式就实现了。如果还有其他的相互关联的同事,如测试妹纸、市场、项目经理等等都可以加进去,由中介者进行关联。
中介者模式之应用场景
接下来我就介绍一下在哪些情况下,可以使用我:
- 一组对象以定义良好但是复杂的方式进行通信。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多子类。
当你在项目中遇到以上情况或者类似的情况时,可以使用我来进行对象间的通信,这样会把复杂的问题简单化~虽然对象过多的时候,会导致中介者过于庞大。恩,鱼哥,我讲完了。(PS:给大家说这句话。)哦,大家,我讲完了。(作者满头黑线的离开了、、、)
PS:本博客欢迎转发,但请注明博客地址及作者~
博客地址:http://www.cnblogs.com/voidy/
博客新址:http://voidy.net
<。)#)))≦
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?