中介者模式
定义
又称为调节者模式或调停者模式。用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。属于行为型模式。
中介者模式包装了一系列对象相互作用的方式。使得这些对象不必相互明显作用。从而使它们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。其核心思想是通过中介这结构系统各层次对象的直接耦合,层次对象的对外依赖通信统统交给中介者转发。
适用情景
- 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
- 交互的公共行为,如果需要改变行为则可以增加新的中介者类。
角色
- 抽象中介者(Mediator):定义统一的接口,用于各同事角色之间的通信。
- 具体中介者(ConcreteMediator):从具体的同事对象接收消息,向具体同事对象发出命令,协调各同事间的协作。
- 抽象同事(Colleague):每个同事对象均需要依赖中介者角色,与其他同事间通信时交由中介者进行转发协作。
- 具体同事类(ConcreteColleague):负责实现自发行为,转发依赖方法交由中介者进行协调。
实例
使用中介者模式设计群聊场景
public class ChatRoom {
public void showMsg(User user, String msg){
System.out.println(String.format("[ %s ] : %s", user.getName(), msg));
}
}
public class User {
private String name;
private ChatRoom chatRoom;
public User(String name, ChatRoom chatRoom) {
this.name = name;
this.chatRoom = chatRoom;
}
public void sendMessage(String msg){
this.chatRoom.showMsg(this, msg);
}
public String getName() {
return name;
}
}
public class Test {
public static void main(String[] args) {
ChatRoom chatRoom = new ChatRoom();
User tom = new User("tom",chatRoom);
User jerry = new User("jerry", chatRoom);
tom.sendMessage("Hi! I am Tom");
jerry.sendMessage("Hello! My name is Jerry");
}
}
中介者模式在源码中的体现
JDK中的Timer
优点
- 减少类间依赖,将多对多依赖转化成一对多,降低耦合
- 类间各司其职,符合迪米特法则
缺点
中介者模式中将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。当同事类越多时,中介者就会越臃肿,变得复杂且难以维护。