什么是中介者模式?

在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是“网状结构”,它要求每个对象都必须知道它需要交互的对象。如果找出一个“中介者”就可以把这种“网状结构”改为“星形结构”大大降低它们之间的“耦合性”。

适用场景

把这种“网状结构”改为“星形结构”大大降低它们之间的“耦合性”的场景。

例如,你刚刚参加工作想租房,可以找“房屋中介”;或者,自己刚刚到一个陌生城市找工作,可以找“人才交流中心”帮忙。

例如,在 MVC 框架中,控制器(C)就是模型(M)和视图(V)的中介者;还有大家常用的 QQ 聊天程序的“中介者”是 QQ 服务器。

代码实现

中介者模式包含以下主要角色。

  1. 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
  2. 具体中介者(Concrete Mediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
  3. 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  4. 具体同事类(Concrete Colleague)角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。 ```java

import java.util.*;

/**

  • 抽象中介者 */ interface Mediator { //注册 void register(Colleague colleague);

    //转发 void relay(Colleague colleague); }

/**

  • 具体中介者 */ class ConcreteMediator implements Mediator { private final Set colleagues = new HashSet<>();

    @Override public void register(Colleague colleague) {

    1. colleagues.add(colleague);
    2. colleague.setMedium(this);

    }

    @Override public void relay(Colleague colleague) {

    1. for (Colleague ob : colleagues) {
    2. if (!ob.equals(colleague)) {
    3. ob.receive();
    4. }
    5. }

    } }

/**

  • 抽象同事类 */ abstract class Colleague { protected Mediator mediator;

    public void setMedium(Mediator mediator) {

    1. this.mediator = mediator;

    }

    //接收 public abstract void receive();

    //发送 public abstract void send();

  1. //hashCode和equals方法
  2. @Override
  3. public boolean equals(Object o) {
  4. if (this == o) {
  5. return true;
  6. }
  7. if (o == null || getClass() != o.getClass()) {
  8. return false;
  9. }
  10. Colleague colleague = (Colleague) o;
  11. return Objects.equals(mediator, colleague.mediator);
  12. }
  13. @Override
  14. public int hashCode() {
  15. return Objects.hash(mediator);
  16. }

}

/**

  • 具体同事类1 */ class ConcreteColleague1 extends Colleague { @Override public void receive() {

    1. System.out.println("具体同事类1收到请求");

    }

    @Override public void send() {

    1. System.out.println("具体同事类1发出请求");
    2. //请中介者转发
    3. mediator.relay(this);

    } }

/**

  • 具体同事类2 */ class ConcreteColleague2 extends Colleague { @Override public void receive() {

    1. System.out.println("具体同事类2收到请求");

    }

    @Override public void send() {

    1. System.out.println("具体同事类2发出请求");
    2. //请中介者转发
    3. mediator.relay(this);

    } }

/**

  • 中介者模式 测试类 */ public class MediatorPattern { public static void main(String[] args) {
    1. Mediator md = new ConcreteMediator();
    2. Colleague c1 = new ConcreteColleague1();
    3. Colleague c2 = new ConcreteColleague2();
    4. md.register(c1);
    5. md.register(c2);
    6. c1.send();
    7. System.out.println("-------------");
    8. c2.send();
    } }

```