本文继续23种设计模式系列之中介者模式。
定义
用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。
角色
抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信。一般包括一个或几个抽象的事件方法,并由子类去实现。
中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法。从一个同事类接收消息,然后通过消息影响其他同时类。
同事类:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类。在类图中,同事类只有一个,这其实是现实的省略,在实际应用中,同事类一般由多个组成,他们之间相互影响,相互依赖。同事类越多,关系越复杂。并且,同事类也可以表现为继承了同一个抽象类的一组实现组成。在中介者模式中,同事类之间必须通过中介者才能进行消息传递。
适用情况

一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如有六个同事类对象,假如对象1发生变化,会有4个对象受到影响。如果对象2发生变化,那么会有5个对象受到影响。也就是说,同事类之间直接关联的设计是不好的。

如果引入中介者模式,那么同事类之间的关系将变为星型结构,任何一个类的变动,只会影响的类本身,以及中介者,这样就减小了系统的耦合。一个好的设计,必定不会把所有的对象关系处理逻辑封装在本类中,而是使用一个专门的类来管理那些不属于自己的行为。

应用

我们使用一个例子来说明一下什么是同事类:有两个类A和B,类中各有一个数字,并且要保证类B中的数字永远是类A中数字的100倍。也就是说,当修改类A的数时,将这个数字乘以100赋给类B,而修改类B时,要将数除以100赋给类A。类A类B互相影响,就称为同事类。代码如下:

[java] view plaincopy print?
  1. abstract class AbstractColleague {
  2. protected int number;
  3. public int getNumber() {
  4. return number;
  5. }
  6. public void setNumber(int number){
  7. this.number = number;
  8. }
  9. //抽象方法,修改数字时同时修改关联对象
  10. public abstract void setNumber(int number, AbstractColleague coll);
  11. }
[java] view plaincopy print?
  1. class ColleagueA extends AbstractColleague{
  2. public void setNumber(int number, AbstractColleague coll) {
  3. this.number = number;
  4. coll.setNumber(number*100);
  5. }
  6. }
[java] view plaincopy print?
  1. class ColleagueB extends AbstractColleague{
  2. public void setNumber(int number, AbstractColleague coll) {
  3. this.number = number;
  4. coll.setNumber(number/100);
  5. }
  6. }
[java] view plaincopy print?
  1. public class Client {
  2. public static void main(String[] args){
  3. AbstractColleague collA = new ColleagueA();
  4. AbstractColleague collB = new ColleagueB();
  5. System.out.println("==========设置A影响B==========");
  6. collA.setNumber(1288, collB);
  7. System.out.println("collA的number值:"+collA.getNumber());
  8. System.out.println("collB的number值:"+collB.getNumber());
  9. System.out.println("==========设置B影响A==========");
  10. collB.setNumber(87635, collA);
  11. System.out.println("collB的number值:"+collB.getNumber());
  12. System.out.println("collA的number值:"+collA.getNumber());
  13. }
  14. }

上面的代码中,类A类B通过直接的关联发生关系,假如我们要使用中介者模式,类A类B之间则不可以直接关联,他们之间必须要通过一个中介者来达到关联的目的。

同事类

[java] view plaincopy print?
  1. abstract class AbstractColleague {
  2. protected int number;
  3. public int getNumber() {
  4. return number;
  5. }
  6. public void setNumber(int number){
  7. this.number = number;
  8. }
  9. //注意这里的参数不再是同事类,而是一个中介者
  10. public abstract void setNumber(int number, AbstractMediator am);
  11. }
  12. class ColleagueA extends AbstractColleague{
  13. public void setNumber(int number, AbstractMediator am) {
  14. this.number = number;
  15. am.AaffectB();
  16. }
  17. }
  18. class ColleagueB extends AbstractColleague{
  19. @Override
  20. public void setNumber(int number, AbstractMediator am) {
  21. this.number = number;
  22. am.BaffectA();
  23. }
  24. }

抽象中介者类

[java] view plaincopy print?
  1. abstract class AbstractMediator {
  2. protected AbstractColleague A;
  3. protected AbstractColleague B;
  4. public AbstractMediator(AbstractColleague a, AbstractColleague b) {
  5. A = a;
  6. B = b;
  7. }
  8. public abstract void AaffectB();
  9. public abstract void BaffectA();
  10. }

中介者类

[java] view plaincopy print?
  1. class Mediator extends AbstractMediator {
  2. public Mediator(AbstractColleague a, AbstractColleague b) {
  3. super(a, b);
  4. }
  5. //处理A对B的影响
  6. public void AaffectB() {
  7. int number = A.getNumber();
  8. B.setNumber(number*100);
  9. }
  10. //处理B对A的影响
  11. public void BaffectA() {
  12. int number = B.getNumber();
  13. A.setNumber(number/100);
  14. }
  15. }

客户端

[java] view plaincopy print?
  1. public class Client {
  2. public static void main(String[] args){
  3. AbstractColleague collA = new ColleagueA();
  4. AbstractColleague collB = new ColleagueB();
  5. AbstractMediator am = new Mediator(collA, collB);
  6. System.out.println("==========通过设置A影响B==========");
  7. collA.setNumber(1000, am);
  8. System.out.println("collA的number值为:"+collA.getNumber());
  9. System.out.println("collB的number值为A的10倍:"+collB.getNumber());
  10. System.out.println("==========通过设置B影响A==========");
  11. collB.setNumber(1000, am);
  12. System.out.println("collB的number值为:"+collB.getNumber());
  13. System.out.println("collA的number值为B的0.1倍:"+collA.getNumber());
  14. }
  15. }

虽然代码比较长,但是还是比较容易理解的,其实就是把原来处理对象关系的代码重新封装到一个中介类中,通过这个中介类来处理对象间的关系。

 

优点

适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用。

使用中介者模式可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护。

使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用。

 

总结

在面向对象编程中,一个类必然会与其他的类发生依赖关系,完全独立的类是没有意义的。一个类同时依赖多个类的情况也相当普遍,既然存在这样的情况,说明,一对多的依赖关系有它的合理性,适当的使用中介者模式可以使原本凌乱的对象关系清晰,但是如果滥用,则可能会带来反的效果。一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式。可以将网状结构变为星状结构,使同事类之间的关系变的清晰一些。

中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂。

更多设计模式:23种设计模式系列

作者:jason0539

博客:http://blog.csdn.net/jason0539(转载请说明出处)

推荐扫码关注公众号,看点不一样的东西

转载于:https://www.cnblogs.com/telwanggs/p/6782029.html

Java 设计模式之中介者模式相关推荐

  1. Java设计模式之中介者模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  2. 中介者模式java_图解Java设计模式之中介者模式

    智能家庭项目 1)智能家庭包括各种设备,闹钟.咖啡机.电视机.窗帘等 2)主人要看电视时,各个设备可以协同工作,自动完成看电视的准备工作,比如流程为 :闹铃响起 - >咖啡机开始做咖啡 -> ...

  3. java设计模式之中介者模式(Mediator)

    在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是"网状结构",它要求每个对象都必须知道它需要交互的对象.例如,每个人必须记住他(她)所有朋友的电话:而且, ...

  4. Java 设计模式 之 中介者模式(Mediator)

    中介者的功能非常简单,就是封装对象之间的交互. 如果一个对象的操作会引起其他相关对象的变化,或者是某个操作需要引起其他对象的后续或连带操作,而这个对象又不希望自己来处理这些关系,那么久可以找中介者,把 ...

  5. [Java]观察者模式和中介者模式改造机场

    [Java]观察者模式和中介者模式改造机场 文章目录 [Java]观察者模式和中介者模式改造机场 题目 代码部分 运行结果 补充 题目 请以下面的情景为基础,将以下的情景进行 优化: 1. 定义4个处 ...

  6. Java设计模式之行为型模式

    1 设计模式简介 软件设计模式是一套被反复使用的,多数人知晓的.经过分类编写.代码设计经验的总结.它描述了在软件设计过程中的一些不断重复发生的问题,以及该问题的解决方案,它是解决特定问题的一系列套路, ...

  7. 软件设计模式之中介者模式实验

    软件设计模式之中介者模式实验 一.实验目的 掌握软件设计模式中的中介者模式,能够用中介者模式编写程序,解决实际问题. 二.实验内容与要求 内容:有个租房中介为房主和租赁人提供租房服务,请用中介者模式对 ...

  8. 走穿java23种设计模式--18中介者模式详解

    走穿java23种设计模式–18中介者模式详解 中介者模式也称调停者模式,是一种比较简单的模式. 一.中介者模式的现实场景 蔡良因为上次表白时对方只看重他的物质方面,所以他对女朋友这个问题有点失望.因 ...

  9. 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern)

    [索引页] [源码下载] 乐在其中设计模式(C#) - 中介者模式(Mediator Pattern) 作者:webabcd 介绍 用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互 ...

最新文章

  1. deconv--反褶积和多项式除法
  2. WPF 用户控件的使用
  3. scala 样例类(case class) + 模式匹配代码示例
  4. Jupyter与PyCharm不可兼得?Jupytext就是你需要的!
  5. redis部署架构总结
  6. php中的file_upload,PHP文件上传(PHP file upload)
  7. 【计算机系统】指令流水线
  8. this-is-how-we-troubleshoot-windows-interoperability-issues-in-the-open-specifications-support-team/
  9. String和StringBuffer的区别
  10. 数据结构-—树的存储结构
  11. HEL上清除Oracle10g clusterware的失败安装
  12. 【JAVA源码分析——Java.lang】String源码分析
  13. 今天生日,高興!!!
  14. 享20个Android游戏源码
  15. JS - Promise使用详解--摘抄笔记
  16. Http Status 500
  17. 跑跑飞弹室外跑步AR游戏代码方案设计
  18. 英文文献翻译格式整理器
  19. 推荐四款非常好用的免费音乐播放器
  20. vue启动时报错——did you register the component correctly? For recursive components

热门文章

  1. MySQL多实例配置
  2. ElasticSearch中doc values和fielddata
  3. 周立功的linux开发板例程,USB NXP LPC1766 开发配套例程(周立功开发板自带例程) - 下载 - 搜珍网...
  4. (28)VHDL实现数码管直译
  5. MicroBlaze软核介绍
  6. java命令大全_Java命令行工具:javac、java、javap 的使用详解
  7. navmenu 收起没有动画 element_ABC360等3家英语动画片课程测评:用动画片学英语不靠谱?...
  8. vs2015打开EXCEL文档范例及其注意事项!!!
  9. 【STM32】关闭JTAG接口,引脚设置推挽输出
  10. 第九章——计数器/定时器和多功能接口芯片