文章摘要: 中介者模式使用总结。
简介
简要说明
- 中介者模式(Mediator Pattern)是一种行为型设计模式。
- 通过引入一个中介者对象来协调多个对象之间的交互,使得对象之间不需要直接通信,而是通过中介者进行间接通信。
主要功能
- 中介者模式通过中介者对象来封装对象之间的交互。
- 它减少了对象之间的直接依赖关系,降低了系统的复杂性。
- 它使得系统易于扩展和维护,因为新增对象只需要与中介者通信即可。
注意事项
- 中介者对象可能会变得非常复杂,因为它需要处理所有对象之间的交互逻辑。
- 如果不恰当使用中介者模式,可能会导致“上帝对象”(一个中介者对象处理过多逻辑),这违背了设计模式的原则。
适用场景
- 当一组对象之间的交互操作很多且复杂时。
- 当一个对象引用了多个对象,并直接与这些对象通信,导致难以复用时。
- 当想要一个对象来统一控制多个对象的交互时。
Java 8
案例
import java.util.ArrayList;
import java.util.List;
// 中介者接口
interface Mediator {
void registerColleague(Colleague colleague);
void sendMessage(String message, Colleague originator);
}
// 同事接口
interface Colleague {
void receiveMessage(String message);
void sendMessage(String message);
}
// 具体的中介者
class ConcreteMediator implements Mediator {
private List<Colleague> colleagues = new ArrayList<>();
@Override
public void registerColleague(Colleague colleague) {
colleagues.add(colleague);
colleague.setMediator(this);
}
@Override
public void sendMessage(String message, Colleague originator) {
// 中介者转发消息给所有同事,除了消息的发送者
for (Colleague colleague : colleagues) {
if (colleague != originator) {
colleague.receiveMessage(message);
}
}
}
}
// 具体的同事类
class ConcreteColleague implements Colleague {
private Mediator mediator;
private String name;
public ConcreteColleague(Mediator mediator, String name) {
this.mediator = mediator;
this.name = name;
mediator.registerColleague(this);
}
@Override
public void receiveMessage(String message) {
System.out.println(name + " received message: " + message);
}
@Override
public void sendMessage(String message) {
System.out.println(name + " sent message: " + message);
// 通过中介者发送消息
mediator.sendMessage(message, this);
}
public void setMediator(Mediator mediator) {
this.mediator = mediator;
}
}
// 客户端代码
public class MediatorPatternDemo {
public static void main(String[] args) {
// 创建中介者
Mediator mediator = new ConcreteMediator();
// 创建同事对象
Colleague colleague1 = new ConcreteColleague(mediator, "Colleague 1");
Colleague colleague2 = new ConcreteColleague(mediator, "Colleague 2");
Colleague colleague3 = new ConcreteColleague(mediator, "Colleague 3");
// 同事之间通过中介者发送消息
colleague1.sendMessage("Hello, World!");
colleague2.sendMessage("How are you?");
colleague3.sendMessage("I'm fine, thank you!");
}
}
注释
- 在这个例子中,
Mediator接口定义了注册同事和发送消息的方法。Colleague接口定义了接收和发送消息的方法。 ConcreteMediator类是具体的中介者,它维护了一个同事列表,并负责转发消息给所有注册的同事(除了消息的发送者)。ConcreteColleague类是具体的同事类,它在构造时注册到中介者,并在发送消息时通过中介者进行转发。- 在客户端代码
MediatorPatternDemo中,我们创建了中介者和三个同事对象。每个同事对象都可以通过中介者发送消息,而中介者则负责将消息转发给其他所有同事。这样,同事之间不需要直接相互引用,而是通过中介者进行通信。