什么是中介者模式?
在现实生活中,常常会出现好多对象之间存在复杂的交互关系,这种交互关系常常是“网状结构”,它要求每个对象都必须知道它需要交互的对象。如果找出一个“中介者”就可以把这种“网状结构”改为“星形结构”大大降低它们之间的“耦合性”。
适用场景
把这种“网状结构”改为“星形结构”大大降低它们之间的“耦合性”的场景。
例如,你刚刚参加工作想租房,可以找“房屋中介”;或者,自己刚刚到一个陌生城市找工作,可以找“人才交流中心”帮忙。
例如,在 MVC 框架中,控制器(C)就是模型(M)和视图(V)的中介者;还有大家常用的 QQ 聊天程序的“中介者”是 QQ 服务器。
代码实现
中介者模式包含以下主要角色。
- 抽象中介者(Mediator)角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
- 具体中介者(Concrete Mediator)角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
- 抽象同事类(Colleague)角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类(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) {
colleagues.add(colleague);
colleague.setMedium(this);
}
@Override public void relay(Colleague colleague) {
for (Colleague ob : colleagues) {
if (!ob.equals(colleague)) {
ob.receive();
}
}
} }
/**
抽象同事类 */ abstract class Colleague { protected Mediator mediator;
public void setMedium(Mediator mediator) {
this.mediator = mediator;
}
//接收 public abstract void receive();
//发送 public abstract void send();
//hashCode和equals方法
@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Colleague colleague = (Colleague) o;
return Objects.equals(mediator, colleague.mediator);
}
@Override
public int hashCode() {
return Objects.hash(mediator);
}
}
/**
具体同事类1 */ class ConcreteColleague1 extends Colleague { @Override public void receive() {
System.out.println("具体同事类1收到请求");
}
@Override public void send() {
System.out.println("具体同事类1发出请求");
//请中介者转发
mediator.relay(this);
} }
/**
具体同事类2 */ class ConcreteColleague2 extends Colleague { @Override public void receive() {
System.out.println("具体同事类2收到请求");
}
@Override public void send() {
System.out.println("具体同事类2发出请求");
//请中介者转发
mediator.relay(this);
} }
/**
- 中介者模式 测试类
*/
public class MediatorPattern {
public static void main(String[] args) {
} }Mediator md = new ConcreteMediator();
Colleague c1 = new ConcreteColleague1();
Colleague c2 = new ConcreteColleague2();
md.register(c1);
md.register(c2);
c1.send();
System.out.println("-------------");
c2.send();
```