概念
通过引入一个中介对象,来封装对象之间复杂的交互关系。各个对象之间不再直接引用或依赖彼此,而是统一通过中介者来进行通信和协作
应用场景
当业务逻辑复杂,大量对象直接持有其他对象的引用时,一旦某一对象发生变化,其他对象都要修改。
使用中介者模式,所有对象只需要与中介者进行交互,降低了对象间的耦合

基本结构

1)中介者接口(Mediator):定义对象交互的接口,声明发送消息的方法
2)具体中介者(ConcreteMediator):实现中介者接口,协调各个具体同事对象之间的通信
3)抽象同事类(Colleague):每个同事对象都持有中介者对象的引用,并通过它与其他同事通信
4)具体同事类(ConcreteColleague):实现具体的同事逻辑,需要与其他对象通信时,通过中介者转发
代码实现
以 “多人聊天室消息转发” 为例
中介者接口
声明聊天室中介者的基本职责
public interface ChatRoomMediator {
void sendMessage(String message, User sender);
void registerUser(User user);
}
抽象同事类
每个用户只持有中介者的引用,依赖中介者接口来通信,而不关心其他用户的存在
public abstract class User {
protected String name;
protected ChatRoomMediator mediator;
public User(String name, ChatRoomMediator mediator) {
this.name = name;
this.mediator = mediator;
}
public abstract void receive(String message);
public abstract void send(String message);
}
具体同事类
具体实现了用户的消息发送和接收逻辑,发送,通过中介者完成
public class ChatUser extends User {
public ChatUser(String name, ChatRoomMediator mediator) {
super(name, mediator);
}
@Override
public void send(String message) {
System.out.println(this.name + " 发送消息:" + message);
mediator.sendMessage(message, this);
}
@Override
public void receive(String message) {
System.out.println(this.name + " 收到消息:" + message);
}
}
具体中介者
持有所有和中介者关联的用户
转发消息给除发送者外的所有用户
public class ChatRoom implements ChatRoomMediator {
private List<User> users = new ArrayList<>();
@Override
public void sendMessage(String message, User sender) {
for (User user : users) {
if (user != sender) {
user.receive(sender.name + ":" + message);
}
}
}
@Override
public void registerUser(User user) {
users.add(user);
}
}
客户端调用
public class ChatClient {
public static void main(String[] args) {
ChatRoom chatRoom = new ChatRoom();
User1 yupi = new ChatUser("鱼皮", chatRoom);
User1 yes = new ChatUser("Yes哥", chatRoom);
User1 y = new ChatUser("小y", chatRoom);
chatRoom.registerUser(yupi);
chatRoom.registerUser(yes);
chatRoom.registerUser(y);
yupi.send("大家好!");
yes.send("Hi 鱼皮!");
}
}
优缺点
优点
1)减少类之间的耦合:将对象之间的交互集中在一个中介者对象中,避免了对象直接引用和依赖其他对象
缺点
1)中介者复杂度高:随着系统功能的增加,中介者本身可能变得非常复杂
