首页/文章列表/文章详情

设计模式之中介模式(三分钟学会一个设计模式)

编程知识1652024-09-24评论

中介模式(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 }

工商银行实现

1packagecom.example.demo.learn.pattern.behavior.mediator;23importlombok.extern.slf4j.Slf4j;45/**6 * @discription7*/8@Slf4j9publicclassICBCBankimplements Bank {1011private UnionPay unionPay;1213@Override14publicvoid sendMsg(String msg) {15 log.warn("工商银行发送消息到企业:" +msg);16unionPay.sendCompany(msg);17}1819@Override20publicvoid receiveMsg(String msg) {21 log.warn("工商银行收到企业消息:" +msg);22}2324@Override25publicvoid register(UnionPay unionPay) {26this.unionPay =unionPay;27}28}

建设银行实现

1packagecom.example.demo.learn.pattern.behavior.mediator;23importlombok.extern.slf4j.Slf4j;45/**6 * @discription7*/8@Slf4j9publicclassCCBBankimplements Bank {1011private UnionPay unionPay;1213@Override14publicvoid sendMsg(String msg) {15 log.warn("建设银行发送消息到企业:" +msg);16unionPay.sendCompany(msg);17}1819@Override20publicvoid receiveMsg(String msg) {21 log.warn("建设银行收到企业消息:" +msg);22}2324@Override25publicvoid register(UnionPay unionPay) {26this.unionPay =unionPay;27}28}

企业接口

1packagecom.example.demo.learn.pattern.behavior.mediator;23publicinterface Company {4void sendMsg(String msg);56void receiveMsg(String msg);78void register(UnionPay unionPay);9}

千度公司

1packagecom.example.demo.learn.pattern.behavior.mediator;23importlombok.extern.slf4j.Slf4j;45/**6 * @discription7*/8@Slf4j9publicclassQianDuCompanyimplements Company {10private UnionPay unionPay;1112@Override13publicvoid sendMsg(String msg) {14 log.warn("千度公司发送消息到银行:" +msg);15unionPay.sendBank(msg);16}1718@Override19publicvoid receiveMsg(String msg) {20 log.warn("千度公司收到银行消息:" +msg);21}2223@Override24publicvoid register(UnionPay unionPay) {25this.unionPay =unionPay;26}27}

大米公司

1packagecom.example.demo.learn.pattern.behavior.mediator;23importlombok.extern.slf4j.Slf4j;45/**6 * @discription7*/8@Slf4j9publicclassDaMiCompanyimplements Company {10private UnionPay unionPay;1112@Override13publicvoid sendMsg(String msg) {14 log.warn("大米公司发送消息到银行:" +msg);15unionPay.sendBank(msg);16}1718@Override19publicvoid receiveMsg(String msg) {20 log.warn("大米公司收到银行消息:" +msg);21}2223@Override24publicvoid register(UnionPay unionPay) {25this.unionPay =unionPay;26}27}

中介类

1packagecom.example.demo.learn.pattern.behavior.mediator;23importcom.alibaba.nacos.shaded.com.google.common.collect.Lists;45importjava.util.List;67/**8 * @discription9*/10publicclass UnionPay {11private List<Bank> bankList =Lists.newArrayList();1213private List<Company> companyList =Lists.newArrayList();1415publicvoid register(Object... components) {16for (Object component : components) {17if(componentinstanceof Company) {18 Company company = (Company) component;19companyList.add(company);20company.register(this);21}22if(componentinstanceof Bank) {23 Bank bank = (Bank) component;24bankList.add(bank);25bank.register(this);26}27}28}2930publicvoid sendBank(String msg) {31for (Bank bank : bankList) {32bank.receiveMsg(msg);33}34}3536publicvoid sendCompany(String msg) {37for (Company company : companyList) {38company.receiveMsg(msg);39}40}41}

主类

1packagecom.example.demo.learn.pattern.behavior.mediator;23/**4 * @discription5*/6publicclass PatternMain {7publicstaticvoid main(String[] args) {8 Bank ccbBank = newCCBBank();9 Bank icbcBank = newICBCBank();10 Company qianDuCompany = newQianDuCompany();11 Company daMiCompany = newDaMiCompany();12 UnionPay unionPay = newUnionPay();13 unionPay.register(ccbBank, icbcBank, qianDuCompany, daMiCompany);14ccbBank.sendMsg("欢迎各位企业来建设银行贷款!");15icbcBank.sendMsg("欢迎各位企业来工行洽谈合作!");16daMiCompany.sendMsg("哪家银行目前有低息企业贷款?");17daMiCompany.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/ )

中介模式的优点是解耦:我们可以直接将第三方提供类进行组织,而不需要修改他们的代码。
缺点也很明显,业务依赖逻辑全部抽离到了中介类中,中介类会过于臃肿。

博客园

这个人很懒...

用户评论 (0)

发表评论

captcha