目录
一、前言
二、中介者模式
三、总结
一、前言
中介者模式(Mediator Pattern)是一种行为型设计模式,又成为调停者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立的改变它们之间的交互。
中介者模式由以下角色组成:
Mediator(中介者):
定义一个接口,用于与各同事对象进行通信。这个接口主要用来协调各同事对象之间的交互
Concrete Mediator(具体中介者):
实现中介者接口,并协调各同事对象之间的交互。具体中介者通常会持有对所有同事对象的引用,并在这些对象之间进行调度和通信
Colleague(同事):
定义一个与中介者进行通信的接口。同事对象知道中介者对象,并且所有的交互都通过中介者来进行
Concrete Colleague(具体同事):
实现同事接口,具体同事通过中介者与其他同事对象进行交互,而不是直接与其他同事对象通信
整个中介者模式的结构图:
二、中介者模式
首先编写中介者抽象类Mediator.class:
public abstract class Mediator {
public abstract void add(Colleague colleague);
public abstract void operation(Colleague colleague, String message);
}
编写具体的中介者类ConcreteMediator.class:
public class ConcreteMediator extends Mediator{
private List<Colleague> colleagues = new ArrayList<>();
@Override
public void add(Colleague colleague) {
if (!colleagues.contains(colleague)) {
colleagues.add(colleague);
colleague.setMediator(this);
}
}
@Override
public void operation(Colleague colleague, String message) {
for (Colleague coll : colleagues) {
if (!coll.equals(colleague)) {
coll.receive(message);
}
}
}
}
编写抽象同事类Colleague.class:
public abstract class Colleague {
protected Mediator mediator;
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
public abstract void receive(String message);
public abstract void send(String message);
}
编写具体的同事类ConcreteColleagueOne.class、ConcreteColleagueTwo.class:
public class ConcreteColleagueOne extends Colleague{
@Override
public void receive(String message) {
System.out.println("具体同事类 ConcreteColleagueOne 接收请求:" + message);
}
@Override
public void send(String message) {
System.out.println("具体同事类 ConcreteColleagueOne 发送请求:" + message);
mediator.operation(this, message);
}
}
public class ConcreteColleagueTwo extends Colleague{
@Override
public void receive(String message) {
System.out.println("具体同事类 ConcreteColleagueTwo 接收请求:" + message);
}
@Override
public void send(String message) {
System.out.println("具体同事类 ConcreteColleagueTwo 发送请求:" + message);
mediator.operation(this, message);
}
}
编写客户端类Client.class:
public class Client {
public static void main(String[] args) {
Mediator concreteMediator = new ConcreteMediator();
Colleague concreteColleague1 = new ConcreteColleagueOne();
Colleague concreteColleague2 = new ConcreteColleagueTwo();
concreteMediator.add(concreteColleague1);
concreteMediator.add(concreteColleague2);
concreteColleague1.send("Hello1");
concreteColleague2.send("Hello2");
}
}
通过代码可以看出,抽象同事类中拥有抽象中介者类,每个具体的同事类中会调用抽象中介类的方法,由具体的中介者实现。
代码测试结果:
三、总结
优点与缺点
优点:
降低耦合性:
通过引入中介者对象,同事对象不再需要显式地引用彼此。它们只需要与中介者对象通信,从而降低了对象之间的耦合度,使得代码更易于维护和扩展
集中控制:
中介者模式将对象之间的交互逻辑集中到一个中介者对象中,简化了对象的管理和协调,便于修改和扩展交互逻辑。
提高可读性和可维护性:
将复杂的对象交互逻辑从对象本身中提取出来放到中介者中,使得每个对象的职责更加单一,代码更清晰,更易于理解和维护。
灵活性和扩展性:
通过改变或扩展中介者对象,可以很方便地改变或扩展系统的交互行为,而不需要修改各个同事对象
缺点:
复杂性增加:
引入了一个新的中介者对象,增加了系统的复杂性。中介者对象本身可能会变得复杂,因为它需要处理所有的交互逻辑
可能导致性能问题:
如果中介者对象处理了大量的交互逻辑,可能会成为性能瓶颈,因为所有的交互都需要通过中介者来处理。
难以维护:
随着系统的规模扩大,中介者对象的逻辑可能变得过于复杂,难以维护。中介者本身可能会变成一个“上帝对象”,负责太多的职责。
应用场景
GUI框架:
在图形用户界面(GUI)中,中介者模式常用于处理各个组件(如按钮、文本框、复选框等)之间的交互。例如,一个表单中多个输入字段之间的相互启用/禁用状态的管理
聊天室应用:
在即时通讯应用中,中介者模式可以用来处理用户之间的消息传递。聊天室服务器可以作为中介者,负责接收消息并分发给其他用户
航空交通管制:
航空交通管制员作为中介者,负责协调不同飞机之间的通信和导航,确保它们安全地在空域中飞行
模块化系统:
在模块化软件系统中,不同模块之间的通信可以通过中介者模式来实现,从而使得各个模块可以独立开发和维护
工作流引擎:
在业务流程管理(BPM)系统中,中介者模式可以用于协调不同步骤和任务之间的交互,确保按照预定的流程顺序执行