『设计模式』电话接线员与中介者模式
23 种设计模式+额外常用设计模式汇总 (持续更新)
引入
- 在面向对象系统的设计和开发过程中,对象之间的交互和通信是最为常见的情况,因为对象间的交互本身就是一种通信。
- 在系统比较小的时候,可能对象间的通信不是很多、对象也比较少之我们可以直接硬编码到各个对象的方法中。
- 当系统规模变大,对象的量变引起系统复杂度的急剧增加,对象间的通信也变得越来越复杂,这时候我们就要提供一个专门处理对象间交互和通信的类,这个中介者就是 Mediator 模式。
- Mediator 模式将对象间的交互和通信封装在一个类中,各个对象间的通信不必显式去声明和引用,大大降低了系统的复杂性能(了解一个对象总比深入熟悉 n 个对象要好)。
- Mediator 模式还带来了系统对象间的松耦合
定义
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
模式结构
- Mediator 模式中,各个 Colleague 维护-一个 Mediator,.当要进行交互,例如图中 ConcreteCoHeague1 和 ConcreteColleague2 之间的交互就可以通过 ConcreteMediator 提供的方法来处理
- ConcreteColleague1 和 ConcreteColleague2 不必维护对各自的引用,甚至它们也不知道各个的存在。Mediator 通过这种方式将多对多的通信简化为了一(Mediator)对多(Colleague) 的通信。
优点
- Mediator 模式是一种很有用并且很常用的模式,它通过将对象间的通信封装到一个类中,将多对多的通信转化为一对多的通信,降低了系统的复杂性。
- Mediator 还获得系统解耦的特性,通过 Mediator,各个 Colleague 就不必维护各自通信的对象和通信协议,降低了系统的耦合性,Mediator 和各个 Colleague 就可以相互独立地修改了。
- Mediator 模式还有一个很显著的特点就是将控制集中,集中的优点就是便于管理,也正符合了 OO 设计中的每个类的职责要单一和集中的原则。
缺点
- 由于控制的集中化,于是把交互复杂性变味了中介者的复杂性,这就使得中介者会变得比任何一个- ConcreteColleague 都复杂。
门面模式和中介者模式
- 门面(Facade)模式和中介者(Mediator)模式有着共同的目的。它们都是调配一组相互耦合的对象的通信。不过门面模式关注的是这组复杂对象如何与外界通信,而中介者模式是调配这组复杂对象之间的通信。
- 可以组合使用,来实现当同事对象发生改变的时候,通知中介对象,让中介对象去进行与其他相关对象的交互
本质
- 封装交互
一个类知道信息越少越好,随着 ConcreteColleague 的数量的变多,如果不采用中介者模式的话,那么每两个类之间实现通信的话是(N-1)N/2 的连接,先不说原则不原则的事情,当到 10 个 ConcreteColleague 类的时候就要写 25 次通信,那么复制粘贴也要很久。为了能够使多个对象能够实现通信,所以采用中介者模式。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
| package 中介者模式
public abstract class Colleague { protected Mediator mediator;
public Colleague(Mediator mediator) { this.mediator = mediator; } }
package 中介者模式 public abstract class Mediator { public abstract void Send(string message, Colleague colleague); }
package 中介者模式 public class ConcreteColleague1 extends Colleague { public ConcreteColleague1(Mediator mediator) { super( mediator);}
public void Send(string message) { mediator.Send(message, this); }
public void Notify(string message) { System.out.println ("同事1得到信息:" + message); } }
public class ConcreteColleague2 extends Colleague { public ConcreteColleague2(Mediator mediator) { super( mediator);}
public void Send(string message) { mediator.Send(message, this); }
public void Notify(string message) { System.out.println ("同事1得到信息:" + message); } } public class ConcreteMediator extends Mediator { private ConcreteColleague1 colleague1; private ConcreteColleague2 colleague2;
public setColleague1(ConcreteColleague1 Colleague1) { this.Colleague1=Colleague1; }
public setColleague1(ConcreteColleague2 Colleague2) { this.Colleague2=Colleague2; }
public override void Send(string message, Colleague colleague) { if(colleague==colleague1) { colleague2.Notify(message); } else { colleague1.Notify(message); } } } public class Program { public static void Main(string[] args) { ConcreteMediator m = new ConcreteMediator(); ConcreteColleague1 c1=new ConcreteColleague1(m); ConcreteColleague2 c2 = new ConcreteColleague2(m); m.Colleague1 = c1; m.Colleague2 = c2; c1.Send("XXXXXXX"); c2.Send("YYYYYYY"); Console.Read(); } } }
|