中介者模式作为一种行为型设计模式,其核心在于解耦系统中对象之间的交互关系。它通过引入一个中介者对象,来集中管理对象之间的通信,从而避免对象之间直接相互引用,降低了系统的耦合性,也提升了系统的可维护性和可扩展性。
1. 核心思想
想象一下一个热闹的聊天室,如果每个人都要直接和其他所有人建立联系才能发送消息,那将是多么混乱和复杂!中介者模式就像聊天室里的管理员,所有用户只需要把消息发送给管理员,管理员会负责将消息转发给对应的接收者。
中介者模式的核心思想就是:将网状结构的复杂交互关系,转化为以中介者为中心的星形结构。
2. 组成要素
- Mediator (中介者): 定义了同事对象之间进行通信的接口。
- ConcreteMediator (具体中介者): 实现了 Mediator 接口,负责协调各个同事对象之间的交互。
- Colleague (同事类): 表示参与交互的各个对象,每个同事类都知道中介者对象,并且与其他同事类进行通信时,都通过中介者对象来完成。
3. 代码示例 (Java)
// 中介者接口
interface Mediator {
void sendMessage(String message, Colleague colleague);
}
// 具体中介者
class ConcreteMediator implements Mediator {
private Colleague colleague1;
private Colleague colleague2;
public void setColleague1(Colleague colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(Colleague colleague2) {
this.colleague2 = colleague2;
}
@Override
public void sendMessage(String message, Colleague colleague) {
if (colleague == colleague1) {
colleague2.receiveMessage(message);
} else {
colleague1.receiveMessage(message);
}
}
}
// 同事类接口
interface Colleague {
void setMediator(Mediator mediator);
void receiveMessage(String message);
void sendMessage(String message);
}
// 具体同事类 1
class ConcreteColleague1 implements Colleague {
private Mediator mediator;
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void receiveMessage(String message) {
System.out.println("Colleague1 received message: " + message);
}
@Override
public void sendMessage(String message) {
mediator.sendMessage(message, this);
}
}
// 具体同事类 2
class ConcreteColleague2 implements Colleague {
private Mediator mediator;
@Override
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
@Override
public void receiveMessage(String message) {
System.out.println("Colleague2 received message: " + message);
}
@Override
public void sendMessage(String message) {
mediator.sendMessage(message, this);
}
}
// 测试
public class Client {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 colleague1 = new ConcreteColleague1();
ConcreteColleague2 colleague2 = new ConcreteColleague2();
mediator.setColleague1(colleague1);
mediator.setColleague2(colleague2);
colleague1.setMediator(mediator);
colleague2.setMediator(mediator);
colleague1.sendMessage("Hello from Colleague1!");
colleague2.sendMessage("Hi from Colleague2!");
}
}
4. 使用场景
- 对象之间存在复杂的交互关系,并且这些关系是动态变化的。
- 希望将对象之间的交互逻辑集中管理,以便于维护和扩展。
- 不希望对象之间直接相互依赖,降低系统耦合度。
5. 优缺点
优点:
- 降低了对象之间的耦合度。
- 简化了对象之间的交互逻辑。
- 易于扩展新的同事类。
缺点:
- 中介者类可能会变得很复杂,承担过多的责任。
6. 总结
中介者模式提供了一种有效的方式来管理对象之间的交互,它可以降低系统的耦合度,提高系统的可维护性和可扩展性。但是,在使用中介者模式时,需要注意中介者类的复杂度,避免中介者类承担过多的责任。