中介者模式提供一个中间类,用于处理其他不同类之间的通信,其他类对象之间不需要显示地相互引用,从而使其松散耦合。典型的例子——星形网络。
一、UML类图
二、代码示例
中介者-接口
public interface Mediator {
void register(Colleague colleague);
void unregister(Colleague colleague);
}
中介者-实现类
public class NetworkMediator implements Mediator {
private List<Colleague> colleagueList = new ArrayList<>();
@Override
public void register(Colleague colleague) {
for (Colleague other : colleagueList) {
if (other != null) other.receiveRegisterNotification(colleague);
}
colleagueList.add(colleague);
}
@Override
public void unregister(Colleague colleague) {
colleagueList.remove(colleague);
for (Colleague other : colleagueList) {
if (other != null) other.receiveUnRegisterNotification(colleague);
}
}
}
参与者-接口
public abstract class Colleague {
private Mediator mediator;
private String name;
public String getName() {
return name;
}
@Override
public String toString() {
return "Colleague{" +
"name='" + name + '\'' +
'}';
}
public Colleague(Mediator mediator, String name) {
this.mediator = mediator;
this.name = name;
}
public abstract void receiveRegisterNotification(Colleague colleague);
public abstract void receiveUnRegisterNotification(Colleague colleague);
}
参与者-实现类
public class ComputerColleague extends Colleague {
private Mediator mediator;
public ComputerColleague(Mediator mediator, String name) {
super(mediator, name);
}
@Override
public void receiveRegisterNotification(Colleague colleague) {
System.out.println("New computer register event with name: " + colleague + "; received @"+this);
}
@Override
public void receiveUnRegisterNotification(Colleague colleague) {
System.out.println("Computer left unregister event with name: " + colleague + "; received @"+this);
}
}
客户类
public class Client {
public static void main(String[] args) {
Mediator mediator = new NetworkMediator();
ComputerColleague computer_a = new ComputerColleague(mediator, "computer A");
ComputerColleague computer_b = new ComputerColleague(mediator, "computer B");
ComputerColleague computer_c = new ComputerColleague(mediator, "computer C");
mediator.register(computer_a);
mediator.register(computer_b);
mediator.register(computer_c);
mediator.unregister(computer_b);
}
}
测试结果
New computer register event with name: Colleague{name='computer B'}; received @Colleague{name='computer A'}
New computer register event with name: Colleague{name='computer C'}; received @Colleague{name='computer A'}
New computer register event with name: Colleague{name='computer C'}; received @Colleague{name='computer B'}
Computer left unregister event with name: Colleague{name='computer B'}; received @Colleague{name='computer A'}
Computer left unregister event with name: Colleague{name='computer B'}; received @Colleague{name='computer C'}
Process finished with exit code 0
三、补充说明
这种模式,过于中心化,中介者封装了所有的通信逻辑,容易变得过于复杂。
四、参考
- https://www.runoob.com/design-pattern/mediator-pattern.html
- https://www.tutorialspoint.com/design_pattern/mediator_pattern.htm
- https://www.geeksforgeeks.org/mediator-design-pattern/
设计模式系列博文导航
一、创建型 - 5种
原型模式(Prototype Pattern)
抽象工厂模式(Abstract Factory Pattern)
建造者模式(Builder Pattern)
工厂模式(Factory Pattern)
单例模式(Singleton Pattern)
助记语:原抽建工单
二、结构型 - 8种
享元模式(Flyweight Pattern)
代理模式(Proxy Pattern)
适配器模式(Adapter Pattern)
外观模式(Facade Pattern)
过滤器模式(Filter/Criteria Pattern)
桥接模式(Bridge Pattern)
组合模式(Composite Pattern)
装饰器模式(Decorator Pattern)
助记语:想呆室外,过桥组装
三、行为型 - 11种
责任链模式(Chain of Responsibility Pattern)
命令模式(Command Pattern)
解释器模式(Interpreter Pattern)
中介者模式(Mediator Pattern)
迭代器模式(Iterator Pattern)
观察者模式(Observer Pattern)
策略模式(Strategy Pattern)
状态模式(State Pattern)
备忘录模式(Memento Pattern)
模板方法模式(Template Pattern)
访问者模式(Visitor Pattern)
助记语:责令解中谍,观测状被模仿