中介者模式(Mediator Pattern)是一种对象行为型模式,主要用于降低系统中对象之间的耦合度,通过引入一个中介者来封装对象之间的交互,使得对象之间的交互更加灵活和可扩展。以下是中介者模式的详细介绍:
一、定义与原理
定义:中介者模式定义了一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,是迪米特法则(最少知识原则)的典型应用。
原理:在中介者模式中,各个对象不再直接相互引用和通信,而是通过中介者来进行间接通信。中介者负责协调各个对象之间的交互,降低了对象之间的耦合性,提高了系统的灵活性和可维护性。
二、主要角色及类图
中介者模式类图:
主要角色:
- 抽象中介者(Mediator):定义了中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
- 具体中介者(ConcreteMediator):实现中介者接口,定义一个集合来管理同事对象,协调各个同事角色之间的交互关系。
- 抽象同事类(Colleague):定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
- 具体同事类(Concrete Colleague):是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。
三、优点
- 降低了对象之间的耦合性:通过引入中介者,使得对象之间的直接依赖关系转变为对中介者的依赖,降低了对象之间的耦合性。
- 提高了系统的灵活性:由于对象之间的交互被封装在中介者中,因此可以独立地改变对象之间的交互方式,而不需要修改对象本身的代码。
- 易于维护和扩展:由于对象之间的交互被中介者所管理,因此当需要增加新的交互或修改现有交互时,只需要修改中介者的代码即可,降低了系统的维护成本和扩展难度。
四、缺点
- 中介者可能会变得复杂:当同事类数量较多时,中介者需要处理大量的交互逻辑,可能会导致中介者的代码变得复杂和难以维护。
- 中介者可能成为系统的瓶颈:由于所有的交互都需要通过中介者来进行,因此中介者的性能可能会成为系统的瓶颈。
五、应用场景
中介者模式适用于以下场景:
- 系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。
- 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。
例如,在聊天室系统中,可以使用中介者模式来管理用户之间的通信;在航空管制系统中,可以使用中介者模式来管理飞机之间的通信;在MVC框架中,控制器(Controller)可以作为模型(Model)和视图(View)之间的中介者等。
六、实现例子
下面是一个简单的Java示例,模拟了一个聊天室场景,其中有多名用户(User)通过聊天室(ChatRoom,即中介者)进行通信。
首先,定义中介者接口:
java
public interface Mediator {
void sendMessage(String from, String to, String message);
void broadcastMessage(String from, String message);
}
然后,实现中介者类(ChatRoom):
java
import java.util.ArrayList;
import java.util.List;
public class ChatRoom implements Mediator {
//这里用list,生产环境用map效率更高,这里仅做演示用
private List<User> users = new ArrayList<>();
@Override
public void sendMessage(String from, String to, String message) {
for (User user : users) {
if (user.getName().equals(to)) {
user.receiveMessage(from, message);
break;
}
}
}
@Override
public void broadcastMessage(String from, String message) {
for (User user : users) {
if (!user.getName().equals(from)) {
user.receiveMessage(from, message);
}
}
}
public void registerUser(User user) {
users.add(user);
user.setMediator(this);
}
}
接下来,定义用户类(User),它依赖于中介者进行通信:
java
public class User {
private String name;
private Mediator mediator;
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public void sendMessage(String to, String message) {
mediator.sendMessage(this.name, to, message);
}
public void broadcastMessage(String message) {
mediator.broadcastMessage(this.name, message);
}
public void receiveMessage(String from, String message) {
System.out.println(from + " says to " + this.name + ": " + message);
}
}
最后,是客户端代码,用于演示如何使用这个中介者模式:
java
public class Client {
public static void main(String[] args) {
ChatRoom chatRoom = new ChatRoom();
User alice = new User("Alice");
User bob = new User("Bob");
User charlie = new User("Charlie");
chatRoom.registerUser(alice);
chatRoom.registerUser(bob);
chatRoom.registerUser(charlie);
alice.sendMessage("Bob", "Hello Bob!");
charlie.broadcastMessage("Hello everyone!");
}
}
在这个例子中,ChatRoom
是中介者,负责用户之间的消息传递。用户(User
)通过中介者(ChatRoom
)来发送和接收消息,而不需要直接与其他用户交互,从而降低了类之间的耦合度。
七、总结
中介者模式是一种有效的设计模式,它通过引入中介者来封装对象之间的交互,降低了对象之间的耦合性,提高了系统的灵活性和可维护性。然而,在使用中介者模式时也需要注意其潜在的缺点,并根据实际情况选择合适的应用场景。
如果中介者模式对你有用,记得点赞收藏。