找回密码
 立即注册
首页 业界区 业界 设计模式之中介模式(三分钟学会一个设计模式) ...

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

哈梨尔 2025-6-6 13:24:33
中介模式(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/ )
区别大概是下面这个样子
直接耦合
1.jpeg

通过中介者组织
2.jpeg

有些人会说AB 对象我就互相调用一下,需要搞这么复杂么?
如果只是简单调用,当然没必要引入中介类,当然是怎么简单怎么来,但是倘若业务未来(或者已经)依赖很复杂,就应该尽早引入中介类,降低类之间不必要的耦合。
来看一个例子,调用双方是
银行和企业,他们可以互相给对方发消息。我们通过中介模式来组织整体结构:
银行接口:
  1. 1 package com.example.demo.learn.pattern.behavior.mediator;
  2. 2
  3. 3 /**
  4. 4  * @discription
  5. 5  */
  6. 6 public interface Bank {
  7. 7     void sendMsg(String msg);
  8. 8
  9. 9     void receiveMsg(String msg);
  10. 10
  11. 11     void register(UnionPay unionPay);
  12. 12 }
复制代码
工商银行实现
  1. 1 package com.example.demo.learn.pattern.behavior.mediator;
  2. 2
  3. 3 import lombok.extern.slf4j.Slf4j;
  4. 4
  5. 5 /**
  6. 6  * @discription
  7. 7  */
  8. 8 @Slf4j
  9. 9 public class ICBCBank implements Bank {
  10. 10
  11. 11     private UnionPay unionPay;
  12. 12
  13. 13     @Override
  14. 14     public void sendMsg(String msg) {
  15. 15         log.warn("工商银行发送消息到企业:" + msg);
  16. 16         unionPay.sendCompany(msg);
  17. 17     }
  18. 18
  19. 19     @Override
  20. 20     public void receiveMsg(String msg) {
  21. 21         log.warn("工商银行收到企业消息:" + msg);
  22. 22     }
  23. 23
  24. 24     @Override
  25. 25     public void register(UnionPay unionPay) {
  26. 26         this.unionPay = unionPay;
  27. 27     }
  28. 28 }
复制代码
建设银行实现
  1. 1 package com.example.demo.learn.pattern.behavior.mediator;
  2. 2
  3. 3 import lombok.extern.slf4j.Slf4j;
  4. 4
  5. 5 /**
  6. 6  * @discription
  7. 7  */
  8. 8 @Slf4j
  9. 9 public class CCBBank implements Bank {
  10. 10
  11. 11     private UnionPay unionPay;
  12. 12
  13. 13     @Override
  14. 14     public void sendMsg(String msg) {
  15. 15         log.warn("建设银行发送消息到企业:" + msg);
  16. 16         unionPay.sendCompany(msg);
  17. 17     }
  18. 18
  19. 19     @Override
  20. 20     public void receiveMsg(String msg) {
  21. 21         log.warn("建设银行收到企业消息:" + msg);
  22. 22     }
  23. 23
  24. 24     @Override
  25. 25     public void register(UnionPay unionPay) {
  26. 26         this.unionPay = unionPay;
  27. 27     }
  28. 28 }
复制代码
企业接口
  1. 1 package com.example.demo.learn.pattern.behavior.mediator;
  2. 2
  3. 3 public interface Company {
  4. 4     void sendMsg(String msg);
  5. 5
  6. 6     void receiveMsg(String msg);
  7. 7
  8. 8     void register(UnionPay unionPay);
  9. 9 }
复制代码
千度公司
  1. 1 package com.example.demo.learn.pattern.behavior.mediator;
  2. 2
  3. 3 import lombok.extern.slf4j.Slf4j;
  4. 4
  5. 5 /**
  6. 6  * @discription
  7. 7  */
  8. 8 @Slf4j
  9. 9 public class QianDuCompany implements Company {
  10. 10     private UnionPay unionPay;
  11. 11
  12. 12     @Override
  13. 13     public void sendMsg(String msg) {
  14. 14         log.warn("千度公司发送消息到银行:" + msg);
  15. 15         unionPay.sendBank(msg);
  16. 16     }
  17. 17
  18. 18     @Override
  19. 19     public void receiveMsg(String msg) {
  20. 20         log.warn("千度公司收到银行消息:" + msg);
  21. 21     }
  22. 22
  23. 23     @Override
  24. 24     public void register(UnionPay unionPay) {
  25. 25         this.unionPay = unionPay;
  26. 26     }
  27. 27 }
复制代码
大米公司
  1. 1 package com.example.demo.learn.pattern.behavior.mediator;
  2. 2
  3. 3 import lombok.extern.slf4j.Slf4j;
  4. 4
  5. 5 /**
  6. 6  * @discription
  7. 7  */
  8. 8 @Slf4j
  9. 9 public class DaMiCompany implements Company {
  10. 10     private UnionPay unionPay;
  11. 11
  12. 12     @Override
  13. 13     public void sendMsg(String msg) {
  14. 14         log.warn("大米公司发送消息到银行:" + msg);
  15. 15         unionPay.sendBank(msg);
  16. 16     }
  17. 17
  18. 18     @Override
  19. 19     public void receiveMsg(String msg) {
  20. 20         log.warn("大米公司收到银行消息:" + msg);
  21. 21     }
  22. 22
  23. 23     @Override
  24. 24     public void register(UnionPay unionPay) {
  25. 25         this.unionPay = unionPay;
  26. 26     }
  27. 27 }
复制代码
中介类
  1. 1 package com.example.demo.learn.pattern.behavior.mediator;
  2. 2
  3. 3 import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
  4. 4
  5. 5 import java.util.List;
  6. 6
  7. 7 /**
  8. 8  * @discription
  9. 9  */
  10. 10 public class UnionPay {
  11. 11     private List<Bank> bankList = Lists.newArrayList();
  12. 12
  13. 13     private List<Company> companyList = Lists.newArrayList();
  14. 14
  15. 15     public void register(Object... components) {
  16. 16         for (Object component : components) {
  17. 17             if (component instanceof Company) {
  18. 18                 Company company = (Company) component;
  19. 19                 companyList.add(company);
  20. 20                 company.register(this);
  21. 21             }
  22. 22             if (component instanceof Bank) {
  23. 23                 Bank bank = (Bank) component;
  24. 24                 bankList.add(bank);
  25. 25                 bank.register(this);
  26. 26             }
  27. 27         }
  28. 28     }
  29. 29
  30. 30     public void sendBank(String msg) {
  31. 31         for (Bank bank : bankList) {
  32. 32             bank.receiveMsg(msg);
  33. 33         }
  34. 34     }
  35. 35
  36. 36     public void sendCompany(String msg) {
  37. 37         for (Company company : companyList) {
  38. 38             company.receiveMsg(msg);
  39. 39         }
  40. 40     }
  41. 41 }
复制代码
主类
  1. 1 package com.example.demo.learn.pattern.behavior.mediator;
  2. 2
  3. 3 /**
  4. 4  * @discription
  5. 5  */
  6. 6 public class PatternMain {
  7. 7     public static void main(String[] args) {
  8. 8         Bank ccbBank = new CCBBank();
  9. 9         Bank icbcBank = new ICBCBank();
  10. 10         Company qianDuCompany = new QianDuCompany();
  11. 11         Company daMiCompany = new DaMiCompany();
  12. 12         UnionPay unionPay = new UnionPay();
  13. 13         unionPay.register(ccbBank, icbcBank, qianDuCompany, daMiCompany);
  14. 14         ccbBank.sendMsg("欢迎各位企业来建设银行贷款!");
  15. 15         icbcBank.sendMsg("欢迎各位企业来工行洽谈合作!");
  16. 16         daMiCompany.sendMsg("哪家银行目前有低息企业贷款?");
  17. 17         daMiCompany.sendMsg("哪家银行目前有工资卡优惠活动?");
  18. 18     }
  19. 19 }
复制代码
运行主类后,效果如下:
  1. 18:58:03.965 [main] WARN com.example.demo.learn.pattern.behavior.mediator.CCBBank - 建设银行发送消息到企业:欢迎各位企业来建设银行贷款!
  2. 18:58:03.969 [main] WARN com.example.demo.learn.pattern.behavior.mediator.QianDuCompany - 千度公司收到银行消息:欢迎各位企业来建设银行贷款!
  3. 18:58:03.969 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司收到银行消息:欢迎各位企业来建设银行贷款!
  4. 18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.ICBCBank - 工商银行发送消息到企业:欢迎各位企业来工行洽谈合作!
  5. 18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.QianDuCompany - 千度公司收到银行消息:欢迎各位企业来工行洽谈合作!
  6. 18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司收到银行消息:欢迎各位企业来工行洽谈合作!
  7. 18:58:03.970 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司发送消息到银行:哪家银行目前有低息企业贷款?
  8. 18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.CCBBank - 建设银行收到企业消息:哪家银行目前有低息企业贷款?
  9. 18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.ICBCBank - 工商银行收到企业消息:哪家银行目前有低息企业贷款?
  10. 18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.DaMiCompany - 大米公司发送消息到银行:哪家银行目前有工资卡优惠活动?
  11. 18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.CCBBank - 建设银行收到企业消息:哪家银行目前有工资卡优惠活动?
  12. 18:58:03.971 [main] WARN com.example.demo.learn.pattern.behavior.mediator.ICBCBank - 工商银行收到企业消息:哪家银行目前有工资卡优惠活动?
复制代码
代码类图如下:
3.jpeg

我们可以从类图发现,银行和企业并没有直接关联,他们都是直接耦合中介类,所有的请求和响应都是和中介类进行交互(防盗连接:本文首发自http://www.cnblogs.com/jilodream/ )
中介模式的优点是解耦:我们可以直接将第三方提供类进行组织,而不需要修改他们的代码。
缺点也很明显,业务依赖逻辑全部抽离到了中介类中,中介类会过于臃肿。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册