中介者模式定义
中介者模式 Mediator Pattern是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。
意图
通过中介将复杂的多对多的网状关系简化为星形关系,中间的节点就是中介。用户面临一个中介的业务,中介去实现复杂的调度关系。
应用实例
1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。
2、机场调度系统。
3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。
代码
定义一个抽象的中介接口,包含了中介的业务方法。
public interface Mediator {
void register(Colleague colleague);
void relay(Colleague colleague);
}
具体的中介,以 QQ 平台为中介,实现了注册和发送信息的方法。
public class QqMediator implements Mediator{
private List<Colleague> colleagueList = new ArrayList<>();
@Override
public void register(Colleague colleague) {
if (!colleagueList.contains(colleague)){
colleagueList.add(colleague);
// 设置中介,建立联系
colleague.setColleague(this);
}
}
@Override
public void relay(Colleague colleague) {
colleagueList.forEach(c->{
if (!c.equals(colleague)){
c.receive();
}
});
}
}
抽象的同事类
public abstract class Colleague {
protected Mediator mediator;
public void setColleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void receive();
public abstract void send();
}
具体的同事
public class WangWu extends Colleague{
@Override
public void receive() {
System.out.println("WangWu收到消息");
}
@Override
public void send() {
System.out.println("WangWu发送消息");
System.out.println("中介代替转发中...");
mediator.relay(this);
}
}
public class ZhangSan extends Colleague{
@Override
public void receive() {
System.out.println("ZhangSan收到消息");
}
@Override
public void send() {
System.out.println("ZhangSan发送消息");
System.out.println("中介代替转发中...");
mediator.relay(this);
}
}
public class LiSi extends Colleague{
@Override
public void receive() {
System.out.println("LiSi收到消息");
}
@Override
public void send() {
System.out.println("LiSi发送消息");
System.out.println("中介代替转发中...");
mediator.relay(this);
}
}
客户端调用中介去发送消息
public class MediatorClient {
public static void main(String[] args) {
// 中介者
Mediator mediator = new QqMediator();
// 平台使用者
Colleague zhangSan = new ZhangSan();
Colleague liSi = new LiSi();
Colleague wangWu = new WangWu();
mediator.register(zhangSan);
mediator.register(liSi);
mediator.register(wangWu);
// ZhangSan 发送消息
zhangSan.send();
liSi.send();
wangWu.send();
}
}