中介者模式,属于行为型设计模式,主要是用来降低多个对象与类之间的通信复杂性。
定义:通过一个中介对象来封装一系列的对象交互,使得各个对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
问题描述:如果在一个系统中对象之间的联系呈现为网状结构,对象之间存在大量的多对多的联系,将导致系统非常复杂,对象与对象之间互相影响,这样直接耦合的关系将会导致系统的过度耦合。
解决方案:可以将系统的网状结构变成以中介者为中心的星形结构,让对象与对象之间不再直接联系,而是通过这个中介者对象与另一个对象发生相互作用。
结构图:
举个例子:讲一个同事之间工作交流的故事。。。
我们通过一个中介者来实现:1. 一个同事向另一个同事发送任务;2.一个同事向所有其他同事发送消息。
1. 新建一个抽象中介者Mediator,它是一个抽象类。代码如下:
2. 分别新建两个具体抽象中介类ConcreteMediator01和ConcreteMediator02,均继承抽象中介者类Mediator。代码如下:
具体抽象中介类ConcreteMediator02雷同,略。
3. 新建一个抽象同事类Colleague,它也是一个抽象类。代码如下:
4. 分别新建三个具体同事类,均继承抽象同事类Colleague。代码如下:
其他具体同事类雷同,略。
5. 功能一:一个同事向另一个同事发送任务。代码如下:
6. 功能二:一个同事向所有其他同事发送消息。代码如下:
7. 运行后的效果,如图所示:
综上,中介者模式将一个网状结构变成一个以中介者对象为中心的星形结构,在这个星形结构中,使用中介者对象与其他对象的一对多关系来取代原有对象之间的多对多关系。
优点:
1. 简化了对象之间的交互。
2. 将各个同事对象解耦,无论是改变还是新增一个同事类或中介者都比较方便。
3. 减少子类生成,各个同事类可被重用。
缺点:在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
适用场景:
1. 一个对象要和很多对象进行直接的通信,导致难以复用该对象。
2. 系统中存在对象之间的多对多的关系;
3. 想通过一个中间类来封装多个类中的行为,而又不想生成太多子类。