登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
业界
›
设计模式之中介模式(三分钟学会一个设计模式) ...
设计模式之中介模式(三分钟学会一个设计模式)
[ 复制链接 ]
哈梨尔
2025-6-6 13:24:33
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
中介模式(Mediator)又称之为调停模式。
mediator [ˈmiːdieɪtə(r)]
n. 调停者;斡旋者;解决纷争的人(或机构); 本意就是解决纠纷的中间人
它是面向对象六大原则中最少知道原则的一个典型应用。
(关于面向对象六大原则,可看前文:https://www.cnblogs.com/jilodream/p/5353512.html)
大概意思就是类设计时与外界尽量减低耦合,尽量少的依赖其他类,这样就会降低类后期修改的风险。
官方的的定义如下:
用一个中介对象来封装一系列的对象交互。中介对象使得其他各个对象不再需要显示的相互引用。使整体的耦合更加松散,而且可以改变独立的改变他们之间的交互。
它是面向对象的23种设计模式中的一种,属于行为模式的范围。
中介模式大概就是这样,比如你去买房,不论是价格讨论,还是房子质量,都通过中介来进行,尽管中介会包装一些逻辑,但是买家不需要管理所有卖家的信息,保留卖家的联系方式。卖家呢也不需要管理买家的信息,保留买家的联系方式。尽管是买卖房子,但是买家和卖家之间都是通过中介来进行交互,并不直接沟通。这样做的好处就是买卖双方都减轻了自己的工作负担,不需要牢记对方的相关特性,所有这些都交给中介来维护。
比如没有加入中介对象时,我们A/B 双方大概需要维护m*n依赖条,如果双方还要互相依赖,则是2*m*n条依赖,当A、B双方的实例越来越多时,情况也会越来越复杂。
当我们加入中介对象时,则只需要维护A/B和中介对象之间的依赖,约2(m+n)条依赖,(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
区别大概是下面这个样子
直接耦合
通过中介者组织
有些人会说AB 对象我就互相调用一下,需要搞这么复杂么?
如果只是简单调用,当然没必要引入中介类,当然是怎么简单怎么来,但是倘若业务未来(或者已经)依赖很复杂,就应该尽早引入中介类,降低类之间不必要的耦合。
来看一个例子,调用双方是
银行和企业,他们可以互相给对方发消息。我们通过中介模式来组织整体结构:
银行接口:
1 package com.example.demo.learn.pattern.behavior.mediator;
2
3 /**
4 * @discription
5 */
6 public interface Bank {
7 void sendMsg(String msg);
8
9 void receiveMsg(String msg);
10
11 void register(UnionPay unionPay);
12 }
复制代码
工商银行实现
1 package com.example.demo.learn.pattern.behavior.mediator;
2
3 import lombok.extern.slf4j.Slf4j;
4
5 /**
6 * @discription
7 */
8 @Slf4j
9 public class ICBCBank implements Bank {
10
11 private UnionPay unionPay;
12
13 @Override
14 public void sendMsg(String msg) {
15 log.warn("工商银行发送消息到企业:" + msg);
16 unionPay.sendCompany(msg);
17 }
18
19 @Override
20 public void receiveMsg(String msg) {
21 log.warn("工商银行收到企业消息:" + msg);
22 }
23
24 @Override
25 public void register(UnionPay unionPay) {
26 this.unionPay = unionPay;
27 }
28 }
复制代码
建设银行实现
1 package com.example.demo.learn.pattern.behavior.mediator;
2
3 import lombok.extern.slf4j.Slf4j;
4
5 /**
6 * @discription
7 */
8 @Slf4j
9 public class CCBBank implements Bank {
10
11 private UnionPay unionPay;
12
13 @Override
14 public void sendMsg(String msg) {
15 log.warn("建设银行发送消息到企业:" + msg);
16 unionPay.sendCompany(msg);
17 }
18
19 @Override
20 public void receiveMsg(String msg) {
21 log.warn("建设银行收到企业消息:" + msg);
22 }
23
24 @Override
25 public void register(UnionPay unionPay) {
26 this.unionPay = unionPay;
27 }
28 }
复制代码
企业接口
1 package com.example.demo.learn.pattern.behavior.mediator;
2
3 public interface Company {
4 void sendMsg(String msg);
5
6 void receiveMsg(String msg);
7
8 void register(UnionPay unionPay);
9 }
复制代码
千度公司
1 package com.example.demo.learn.pattern.behavior.mediator;
2
3 import lombok.extern.slf4j.Slf4j;
4
5 /**
6 * @discription
7 */
8 @Slf4j
9 public class QianDuCompany implements Company {
10 private UnionPay unionPay;
11
12 @Override
13 public void sendMsg(String msg) {
14 log.warn("千度公司发送消息到银行:" + msg);
15 unionPay.sendBank(msg);
16 }
17
18 @Override
19 public void receiveMsg(String msg) {
20 log.warn("千度公司收到银行消息:" + msg);
21 }
22
23 @Override
24 public void register(UnionPay unionPay) {
25 this.unionPay = unionPay;
26 }
27 }
复制代码
大米公司
1 package com.example.demo.learn.pattern.behavior.mediator;
2
3 import lombok.extern.slf4j.Slf4j;
4
5 /**
6 * @discription
7 */
8 @Slf4j
9 public class DaMiCompany implements Company {
10 private UnionPay unionPay;
11
12 @Override
13 public void sendMsg(String msg) {
14 log.warn("大米公司发送消息到银行:" + msg);
15 unionPay.sendBank(msg);
16 }
17
18 @Override
19 public void receiveMsg(String msg) {
20 log.warn("大米公司收到银行消息:" + msg);
21 }
22
23 @Override
24 public void register(UnionPay unionPay) {
25 this.unionPay = unionPay;
26 }
27 }
复制代码
中介类
1 package com.example.demo.learn.pattern.behavior.mediator;
2
3 import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
4
5 import java.util.List;
6
7 /**
8 * @discription
9 */
10 public class UnionPay {
11 private List<Bank> bankList = Lists.newArrayList();
12
13 private List<Company> companyList = Lists.newArrayList();
14
15 public void register(Object... components) {
16 for (Object component : components) {
17 if (component instanceof Company) {
18 Company company = (Company) component;
19 companyList.add(company);
20 company.register(this);
21 }
22 if (component instanceof Bank) {
23 Bank bank = (Bank) component;
24 bankList.add(bank);
25 bank.register(this);
26 }
27 }
28 }
29
30 public void sendBank(String msg) {
31 for (Bank bank : bankList) {
32 bank.receiveMsg(msg);
33 }
34 }
35
36 public void sendCompany(String msg) {
37 for (Company company : companyList) {
38 company.receiveMsg(msg);
39 }
40 }
41 }
复制代码
主类
1 package com.example.demo.learn.pattern.behavior.mediator;
2
3 /**
4 * @discription
5 */
6 public class PatternMain {
7 public static void main(String[] args) {
8 Bank ccbBank = new CCBBank();
9 Bank icbcBank = new ICBCBank();
10 Company qianDuCompany = new QianDuCompany();
11 Company daMiCompany = new DaMiCompany();
12 UnionPay unionPay = new UnionPay();
13 unionPay.register(ccbBank, icbcBank, qianDuCompany, daMiCompany);
14 ccbBank.sendMsg("欢迎各位企业来建设银行贷款!");
15 icbcBank.sendMsg("欢迎各位企业来工行洽谈合作!");
16 daMiCompany.sendMsg("哪家银行目前有低息企业贷款?");
17 daMiCompany.sendMsg("哪家银行目前有工资卡优惠活动?");
18 }
19 }
复制代码
运行主类后,效果如下:
18:58:03.965 [main] WARN com.example.demo.learn.pattern.behavior.mediator.CCBBank - 建设银行发送消息到企业:欢迎各位企业来建设银行贷款!
18:58:03.969 [main] WARN com.example.demo.learn.pattern.behavior.mediator.QianDuCompany - 千度公司收到银行消息:欢迎各位企业来建设银行贷款!
18:58:03.969 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司收到银行消息:欢迎各位企业来建设银行贷款!
18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.ICBCBank - 工商银行发送消息到企业:欢迎各位企业来工行洽谈合作!
18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.QianDuCompany - 千度公司收到银行消息:欢迎各位企业来工行洽谈合作!
18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司收到银行消息:欢迎各位企业来工行洽谈合作!
18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司发送消息到银行:哪家银行目前有低息企业贷款?
18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.CCBBank - 建设银行收到企业消息:哪家银行目前有低息企业贷款?
18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.ICBCBank - 工商银行收到企业消息:哪家银行目前有低息企业贷款?
18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司发送消息到银行:哪家银行目前有工资卡优惠活动?
18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.CCBBank - 建设银行收到企业消息:哪家银行目前有工资卡优惠活动?
18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.ICBCBank - 工商银行收到企业消息:哪家银行目前有工资卡优惠活动?
复制代码
代码类图如下:
我们可以从类图发现,银行和企业并没有直接关联,他们都是直接耦合中介类,所有的请求和响应都是和中介类进行交互(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
中介模式的优点是解耦:我们可以直接将第三方提供类进行组织,而不需要修改他们的代码。
缺点也很明显,业务依赖逻辑全部抽离到了中介类中,中介类会过于臃肿。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
设计模式
中介
模式
三分钟
学会
相关帖子
【RabbitMQ】RPC模式(请求/回复)
TypeScript 中的策略模式
云服务模式进化论:企业云战略的致命误区,从IaaS到FaaS的死亡之旅!
Windows安装MySQL,无服务模式,随用随有,一键初始化,可替换phpstudy_pro
Go语言实现GoF设计模式:适配器模式
09.创建型 - 原型模式 (Prototype Pattern)
09.创建型 - 原型模式 (Prototype Pattern)
10.结构型 - 代理模式 (Proxy Pattern)
11.结构型 - 桥接模式 (Bridge Pattern)
Spring Cloud Gateway WebFlux 模式架构分析
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
【RabbitMQ】RPC模式(请求/回复)
0
306
普料飕
2025-11-01
业界
TypeScript 中的策略模式
1
555
仰翡邸
2025-11-10
安全
云服务模式进化论:企业云战略的致命误区,从IaaS到FaaS的死亡之旅!
0
207
鄂缮输
2025-11-12
业界
Windows安装MySQL,无服务模式,随用随有,一键初始化,可替换phpstudy_pro
0
907
岑韬哎
2025-11-14
安全
Go语言实现GoF设计模式:适配器模式
0
472
柩通奉
2025-11-19
安全
09.创建型 - 原型模式 (Prototype Pattern)
0
605
揭荸
2025-11-24
安全
09.创建型 - 原型模式 (Prototype Pattern)
0
686
蒲善思
2025-11-24
安全
10.结构型 - 代理模式 (Proxy Pattern)
1
440
计海龄
2025-12-03
安全
11.结构型 - 桥接模式 (Bridge Pattern)
0
870
赖琳芳
2025-12-04
业界
Spring Cloud Gateway WebFlux 模式架构分析
0
533
国瑾瑶
2025-12-05
回复
(2)
倡遍竽
2025-10-30 00:46:43
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
前排留名,哈哈哈
龙骋唧
昨天 17:01
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
不错,里面软件多更新就更好了
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
哈梨尔
昨天 17:01
关注
0
粉丝关注
17
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
anyue1937
9994893
kk14977
6845355
3934307807
991122
4
xiangqian
638210
5
宋子
9987
6
闰咄阅
9991
7
刎唇
9993
8
俞瑛瑶
9998
9
蓬森莉
9952
10
匝抽
9986
查看更多