携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
模式分析
中介者模式(Mediator Design)又称为调停者模式,将对象间的交互进行封装,使两个对象之间不需要显示引用即可调用对方。
他和观察者模式不同的是,观察者模式是一种“发布-订阅”的模型,观察者对将自己注册到被观察上,当被观察者更新后调用观察者的方法进行通知;而中介者模式中的成员是平等的,中介者在结构上提供中转作用,在行为上提供协调(或者说转发)的作用,是去中心化的。
中介者的类图如下
中介者
public abstract class Mediator {
Map<Long, Colleague> map = new HashMap<>();
public void register(Colleague mediator) {
map.put(mediator.getId(), mediator);
}
public abstract void operate(long id, String msg);
}
public class ConcreteMediator extends Mediator {
@Override
public void operate(long id, String msg) {
map.get(id).receive(msg);
}
}
同事类
public abstract class Colleague {
private final Long id;
protected Mediator mediator;
public Colleague(Long id, Mediator mediator) {
this.id = id;
this.mediator = mediator;
}
public Long getId() {
return id;
}
public abstract void receive(String msg);
public abstract void sendMsg(long id, String msg);
}
public class ConcreteColleague extends Colleague {
public ConcreteColleague(Long id, Mediator mediator) {
super(id, mediator);
}
@Override
public void receive(String msg) {
System.out.println(msg);
}
@Override
public void sendMsg(long id, String msg) {
mediator.operate(id, msg);
}
}
中介者模式的优缺点
优点
中介者模式将交互封装,将各成员解耦,简化对象的交互,是迪米特法则*(一个对象应该对其他对象保持最少的了解)*的典型应用。
缺点
中介者中包含了成员对象的交互细节,可能会导致中介者变得复杂。
中介者模式的使用场景
多个成员之间存在互相调用的场景都可以使用中介者模式来减少耦合,最常见的IM系统中,用户可以向其他用户发送消息,所有的消息都经过了中介者进行路由转发,这就是一个典型的中介者模式。