中介者模式的定义:
中结者模式又叫作调解者模式或调停者模式。用一个中介对象封装一系列对象交互,中介者使各对象不需要显示地相互作用,
从而使其耦合松散,而且可以独立得改变它们之间得交互,属于行为型设计模式。
中介者模式得应用场景:
系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
交互的公共行为,如果需要改变行为,则可以增加新的中介者类。
中介者模式的UML类图:
由上图可以看到,中介者模式主要包含4个角色。
抽象中介者(Mediator):定义统一的接口,用于各个同事之间的通信。
具体中介者(ConcreteMediator):从具体的同事对象接收消息,向具体的同事对象发出命令,协调各同事间的协作。
抽象同事类(Colleague):每一个同事对象均需要依赖中介者角色,于其他同事间通信时,交由中介者进行转发协作。
具体同事类(ConcreteColleague):负责实现自发行为,转发依赖方法交由中介者进行协调。、
使用中介者模式设计群聊场景:
假设我们需要构建一个聊天室系统,用户可以向聊天室发送消息,聊天室会向所有用户显示消息。实际上就是用户发消息
与聊天室显示的通信过程,不过用户无法直接将信息发给聊天室,而需要将信息先发到服务器上,然后服务器再将该消息发给
聊天室进行显示,具体代码如下。首先创建User类。
public class User {
private String name;
private ChatRoom chatRoom;
public User(String name, ChatRoom chatRoom) {
this.name = name;
this.chatRoom = chatRoom;
}
public String getName() {
return name;
}
public void sendMessage(String msg){
this.chatRoom.showMsg(this,msg);
}
}
然后创建ChatRoom类。
public classChatRoom {public voidshowMsg(User user,String msg){
System.out.println("[" + user.getName() + "] : " +msg);
}
}
最后编写测试代码。
public classTest {public static voidmain(String[] args) {
ChatRoom chatRoom= newChatRoom();
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.");
}
}
中介者模式的优点:
减少类间的依赖,将多对多依赖转化成一对多,降低了类间耦合。
类间各司其职,符合迪米特法则。
中介者模式的缺点:
中介者模式将原本多个对象直接的相互依赖变成了中介者和多个同事类的依赖关系。
当同事类越多时,中介者就会臃肿,变得复杂且难以维护。