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