设计模式-中介者

  1. 意图
  2. 例子
  3. 适用性
  4. 结构
  5. 协作
  6. 效果

意图

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

例子

首先是中介者接口定义,接口中的提供了功能定义了赢的人是谁,输的人有谁,以及赢了多少

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);
}
}

适用性

  1. 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
  2. 一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
  3. 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

结构

github

协作

同事向一个中介者对象发送和接收请求。中介者在各同事间适当地转发请求以实现协作行为。

效果

中介者模式有以下优点和缺点 :

  1. 减少了子类生成
    Mediator 将原本分布于多个对象间的行为集中在一起。改变这些行为只需生成 Mediator 的子类即可。这样各个 Colleague 类可被重用。
  2. 它将各 Colleague 解耦
    Mediator 有利于各 Colleague 间的松耦合 . 你可以独立的改变和复用各 Colleague 类和 Mediator 类。
  3. 它简化了对象协议
    用 Mediator 和各 Colleague 间的一对多的交互来代替多对多的交互 。一对多的关系更易于理解、维护和扩展。
  4. 它对对象如何协作进行了抽象
    将中介作为一个独立的概念并将其封装在一个对象中,使你将注意力从对象各自本身的行为转移到它们之间的交互上来。这有助于弄清楚一个系统中的对象是如何交互的。
  5. 它使控制集中化
    中介者模式将交互的复杂性变为中介者的复杂性。因为中介者封装了协议 , 它可能变得比任一个 Colleague 都复杂。 这可能使得中介者自身成为一个难于维护的庞然大物。