意图
用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
例子
首先是中介者接口定义,接口中的提供了功能定义了赢的人是谁,输的人有谁,以及赢了多少public interface Mediator {
void win(Colleague winer, int data, Colleague ...losers);
}
以及实现该接口的对象,主要对用户进行计算public class ConcreteMediator implements Mediator {
public void win(Colleague winer, int data, Colleague ...losers) {
winer.add(data);
foreach(Colleage c : losers) {
c.subtraction(data);
}
}
}
接下来是用户的接口public interface Colleague {
void add(int data);
void subtraction(int data);
}
然后我们针对用户进行实现public class ConcreteColleague implements Colleague {
private int data = 0;
public ConcreteColleague(int data) {
this.data = data;
}
public void add(int data) {
this.data += data;
}
public void subtraction(int data) {
this.data -= data;
}
}
主要通过中介者来对同事的数据进行计算public class Main() {
public static void main(String[] args) {
Mediator mediator = new ConcreteMediator();
Colleague c1 = new ConcreteColleague(100);
Colleague c2 = new ConcreteColleague(800);
Colleague c3 = new ConcreteColleague(400);
mediator.win(c1, 10, c2, c3);
mediator.win(c3, 100, c1);
mediator.win(c2, -10, c3);
}
}
适用性
- 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
- 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
- 想定制一个分布在多个类中的行为,而又不想生成太多的子类。
结构
协作
同事向一个中介者对象发送和接收请求。中介者在各同事间适当地转发请求以实现协作行为。
效果
中介者模式有以下优点和缺点 :
- 减少了子类生成
Mediator 将原本分布于多个对象间的行为集中在一起。改变这些行为只需生成 Mediator 的子类即可。这样各个 Colleague 类可被重用。 - 它将各 Colleague 解耦
Mediator 有利于各 Colleague 间的松耦合 . 你可以独立的改变和复用各 Colleague 类和 Mediator 类。 - 它简化了对象协议
用 Mediator 和各 Colleague 间的一对多的交互来代替多对多的交互 。一对多的关系更易于理解、维护和扩展。 - 它对对象如何协作进行了抽象
将中介作为一个独立的概念并将其封装在一个对象中,使你将注意力从对象各自本身的行为转移到它们之间的交互上来。这有助于弄清楚一个系统中的对象是如何交互的。 - 它使控制集中化
中介者模式将交互的复杂性变为中介者的复杂性。因为中介者封装了协议 , 它可能变得比任一个 Colleague 都复杂。 这可能使得中介者自身成为一个难于维护的庞然大物。