中介者模式(Mediator Pattern)
中介者模式是一种行为设计模式,它通过一个中介对象来封装一系列对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
概念
- 中介者(Mediator):定义一个接口用于与各同事(Colleague)对象通信。
- 具体中介者(Concrete Mediator):实现中介者的接口,并协调同事对象之间的交互关系。
- 同事类(Colleague):与其他同事对象通信时,只与中介者对象交互,而不是直接与其他同事类交互。
优点
- 减少类间的依赖关系:将多个类之间的通信封装到一个类中,多个类相互之间的关系变得更加简单。
- 集中控制交互:集中控制交互复杂性,中介者负责协调各同事之间的交互,使各同事类更易于管理和维护。
- 提高可复用性:将对象的行为方式封装在它们的互动中,从而使得它们更容易被独立地复用。
缺点
- 中介者可能过于复杂:如果设计不当,中介者对象本身变得过于复杂,这反而会使整个系统更难理解和维护。
- 过度集中化:随着逻辑的增加,中介者可能演变成一个巨大的类,集中过多的责任,使得系统扩展和维护复杂化。
Java代码示例
假设我们有一个简单的聊天室,其中的用户互相发送消息,使用中介者模式来简化用户之间的通信。
java复制代码
// 中介者接口
interface Mediator {
void send(String message, Colleague colleague);
}
// 具体中介者
class ChatMediator implements Mediator {
private List<Colleague> colleagues;
public ChatMediator() {
this.colleagues = new ArrayList<>();
}
public void addColleague(Colleague colleague) {
colleagues.add(colleague);
}
@Override
public void send(String message, Colleague colleague) {
for (Colleague c : colleagues) {
// Don't tell the user about their own message
if (c != colleague) {
c.receive(message);
}
}
}
}
// 同事抽象类
abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void send(String message);
public abstract void receive(String message);
}
// 具体同事类
class User extends Colleague {
public User(Mediator mediator) {
super(mediator);
}
@Override
public void send(String message) {
System.out.println("User Sending: " + message);
mediator.send(message, this);
}
@Override
public void receive(String message) {
System.out.println("User Received: " + message);
}
}
// 客户端代码
public class MediatorDemo {
public static void main(String[] args) {
ChatMediator mediator = new ChatMediator();
User user1 = new User(mediator);
User user2 = new User(mediator);
mediator.addColleague(user1);
mediator.addColleague(user2);
user1.send("Hi there!");
user2.send("Hello!");
}
}
在这个例子中,ChatMediator
作为中介者,负责传递消息。每个 User
实例是一个同事类,它们通过中介者与其他用户通信。这样,用户之间不直接相互通信,而是通过中介者来进行,这样可以很容易地添加更多的用户或修改通信逻辑。