目录
中介者模式
对于那些对象之间存在复杂交互关系的系统,中介者模式提供了一种简化复杂交互关系的解决方案,它通过引入中介者将原本对象之间的两两交互转化为每个对象与中介者之间的交互,中介者可以对对象之间的通信进行控制与协调,降低原有系统的耦合度,使得系统更加灵活,也更易于扩展.
中介者模式概述
如果在一个系统中对象之间的联系呈现为网状结构,对象之间存在大量的多对多联系,将导致系统非常复杂,这些对象既会影响别的对象,也会被别的对象所影响,这些对象称为同事对象,它们之间通过彼此的相互作用实现系统的行为.在网状结构中,几乎每个对象都需要与其他对象发生相互作用,而这种相互作用表现为一个对象与另外一个对象的直接耦合,这将导致一个过度耦合的系统.
中介者模式可以使对象之间的关系数量急剧减少,通过引入中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构,在这个星形结构中,同事对象不再直接与另一个对象联系,它通过中介者对象与另一个对象发生相互作用.中介者对象的存在保证了对象结构上的稳定,也就是说,系统的结构不会因为新对象的引入带来大量的修改工作.
如果在一个系统中对象之间存在多对多的相互关系,我们可以将对象之间的一些交互行为从各个对象中分离出来,并集中封装在一个中介者对象中,并由该中介者进行统一协调,这样对象之间多对多的复杂关系就转化为相对简单的一对多关系.
中介者模式:定义一个对象来封装一系列对象的交互.中介者模式使各对象之间不需要显式地相互引用,从而使其耦合松散,而且用户可以独立地改变它们之间的交互.
中介者模式又称为调停者模式,它是一种对象行为型模式,在中介者模式中,通过引入中介者来简化对象之间的复杂交互,中介者模式是“迪米特法则”的一个典型应用.
中介者模式结构
中介者模式包含4个角色:
- 抽象中介者
- 具体中介者
- 抽象同事类
- 具体同事类
中介者模式实现
中介者类承担了两个方面的职责:
- 中转作用(结构性):通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,可通过中介者来实现间接调用.该中转作用属于中介者在结构上的支持.
- 协调作用(行为性):中介者可以更进一步的对同事之间的关系进行封装,同事可以一致的和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装.该协调作用属于中介者在行为上的支持.
抽象中介者类
abstract class Mediator {
protected ArrayList<Colleague> colleagues; //用于存储同事对象
//注册方法,用于增加同事对象
public void register(Colleague colleague) {
colleagues.add(colleague);
}
//声明抽象的业务方法
public abstract void operation();
}
具体中介者类
class ConcreteMediator extends Mediator {
//实现业务方法,封装同事之间的调用
public void operation() {
......
((Colleague)(colleagues.get(0))).method1(); //通过中介者调用同事类的方法
......
}
}
抽象同事类
abstract class Colleague {
protected Mediator mediator; //维持一个抽象中介者的引用
public Colleague(Mediator mediator) {
this.mediator=mediator;
}
public abstract void method1(); //声明自身方法,处理自己的行为
//定义依赖方法,与中介者进行通信
public void method2() {
mediator.operation();
}
}
具体同事类
class ConcreteColleague extends Colleague {
public ConcreteColleague(Mediator mediator) {
super(mediator);
}
//实现自身方法
public void method1() {
......
}
}
在具体同事类中实现了在抽象同事类中声明的方法,其中方法method1()是同事类的自身方法,用于处理自己的行为,而方法method2()是依赖方法,用于调用在中介者中定义的方法,依赖中介者来完成相应的行为,例如调用另一个同事类的相关方法.
中介者模式优/缺点与适用环境
中介者模式优点
- 简化了对象之间的交互,可将各同事对象解耦,还可以减少子类的生成.
中介者模式缺点
- 在具体中介者类中包含了大量同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护.
中介者模式适用环境
- 系统中对象存在复杂的引用关系,系统结构混乱且难以理解.
- 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象.
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类.