java 设计模式之中介者模式
概要
在软件开发中,设计模式是解决常见问题的最佳实践。中介者模式(Mediator Pattern)是一种行为型设计模式,它用于减少对象之间的直接交互,通过引入一个中介者对象来协调这些对象之间的交互。这样做的好处包括降低系统的耦合度,提高系统的可扩展性和可维护性。
一、中介者模式概述
中介者模式定义了一个中介对象来封装一系列对象之间的交互,使这些对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
二、中介者模式的结构
中介者模式主要包含以下几个角色:
- 中介者(Mediator):定义对象间交互的接口,并持有对象集合,协调多个同事对象之间的交互。
- 同事(Colleague):在中介者模式中,每一个同事对象都知道中介者对象,并与之通信,但不知道其他同事对象。
三、中介者模式的实现
下面是一个简单的Java示例,演示了中介者模式的应用。假设我们有一个聊天室系统,其中有多名用户,用户之间通过聊天室进行通信。
1. 定义中介者接口
public interface ChatRoom {
void showMessage(User user, String message);
}
2. 实现中介者
public class ConcreteChatRoom implements ChatRoom {
private List<User> users = new ArrayList<>();
public void register(User user) {
users.add(user);
user.setChatRoom(this);
}
@Override
public void showMessage(User user, String message) {
for (User u : users) {
if (u != user) {
u.receive(user.getName(), message);
}
}
}
}
3. 定义同事类
public abstract class User {
protected String name;
protected ChatRoom chatRoom;
public User(String name) {
this.name = name;
}
public void setChatRoom(ChatRoom chatRoom) {
this.chatRoom = chatRoom;
}
public abstract void receive(String sender, String message);
public void send(String message) {
chatRoom.showMessage(this, message);
}
public String getName() {
return name;
}
}
4. 同事类的具体实现
public class ConcreteUser extends User {
public ConcreteUser(String name) {
super(name);
}
@Override
public void receive(String sender, String message) {
System.out.println(sender + " says: " + message);
}
}
5. 客户端代码
public class Client {
public static void main(String[] args) {
ChatRoom chatRoom = new ConcreteChatRoom();
User user1 = new ConcreteUser("Alice");
User user2 = new ConcreteUser("Bob");
chatRoom.register(user1);
chatRoom.register(user2);
user1.send("Hello, Bob!");
user2.send("Hi, Alice. How are you?");
}
}
四、中介者模式的优点与缺点
优点:
- 降低耦合度:同事类之间不直接交互,而是通过中介者进行交互,减少了同事类之间的依赖。
- 易于扩展:增加新的同事类或修改现有同事类的行为时,只需修改中介者即可,符合开闭原则。
- 集中控制:中介者可以控制同事之间的交互,有利于系统的整体控制。
缺点:
- 中介者可能过于复杂:如果同事类之间的交互非常复杂,中介者可能会变得庞大和难以维护。
- 可能产生中介者依赖:同事类依赖于中介者,如果中介者出现问题,可能会影响整个系统的运行。
五、总结
中介者模式是一种非常有用的设计模式,它通过引入中介者来降低对象之间的耦合度,提高系统的可扩展性和可维护性。在设计复杂的系统时,可以考虑使用中介者模式来管理对象之间的交互。