中介者模式
1 概述
- 中介者模式(Mediator Pattern)是一种行为型设计模式,它通过一个中介者对象来封装一系列对象之间的交互,使对象之间不需要显式地相互引用,从而使它们可以松散耦合。中介者模式通过引入中介者对象,简化对象之间的通信,减少类之间的依赖关系,提升系统的可维护性和扩展性。
- 中介者模式定义了一个中介者接口,由具体的中介者类实现具体的协调工作。各个对象通过中介者进行通信,而不需要相互引用。
2 优缺点及应用场景
2.1 优点
- 1)降低耦合度:对象之间的通信通过中介者进行,从而减少了对象之间的直接依赖。
- 2)集中控制:中介者集中管理对象之间的交互,使得交互更加清晰和易于管理。
- 3)提升可维护性和扩展性:新的对象或交互只需修改中介者,符合开闭原则。
2.2 缺点
- 1)中介者复杂性增加:随着对象数量和交互的增加,中介者可能变得复杂,难以维护。
- 2)性能问题:由于中介者集中管理对象之间的交互,可能会导致性能瓶颈。
2.3 应用场景
- 1)MVC 框架:控制器作为模型和视图的中介者。
- 2)复杂对象之间的通信:对象之间的交互比较复杂且多变的场景。
- 3)需要解耦对象之间的关系:希望通过引入中介者减少对象之间直接依赖的场景。
- 4)需要集中管理对象交互:希望通过中介者集中管理和控制对象之间的交互行为的场景。
3 结构
- 1)中介者(Mediator):定义一个接口,用于与各同事对象通信。
- 2)具体中介者(ConcreteMediator):实现中介者接口,协调各同事对象之间的交互。
- 3)同事(Colleague):定义各同事对象的接口,并包含一个中介者的引用。
- 4)具体同事(ConcreteColleague):实现同事接口,通过中介者与其他同事对象进行交互。
4 实现
4.1 UML 类图

4.2 代码示例
class ChatRoom {
public static void showMessage(User user, String message) {
System.out.println(new Date().toString() + " [" + user.getName() + "] : " + message);
}
}
class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public User(String name) {
this.name = name;
}
public void sendMessage(String message) {
ChatRoom.showMessage(this, message);
}
}
public class MediatorPatternDemo {
public static void main(String[] args) {
User robert = new User("Robert");
User john = new User("John");
robert.sendMessage("Hi! John!");
john.sendMessage("Hello! Robert!");
}
}
Thu Jan 31 16:05:46 IST 2013 [Robert] : Hi! John!
Thu Jan 31 16:05:46 IST 2013 [John] : Hello! Robert!
5 总结
- 中介者模式通过一个中介者对象来封装一系列对象之间的交互,使对象之间不需要显式地相互引用,从而使它们可以松散耦合。中介者模式适用于复杂对象之间的通信、需要解耦对象之间的关系以及需要集中管理对象交互的场景。尽管中介者模式降低了对象之间的耦合度,并简化了对象之间的通信,但也可能导致中介者复杂性增加和性能问题。在实际应用中,需要根据具体需求合理使用中介者模式,以实现灵活可扩展的系统设计。