中介者模式(Mediator Pattern)
概念
中介者模式是一种行为型设计模式,通过引入一个中介者对象,来减少多个对象之间的直接交互。中介者将对象之间的交互封装在一个统一的接口中,从而降低对象之间的耦合度,增强系统的可维护性和可扩展性。
应用场景
-
复杂的对象交互:当系统中存在多个对象并且它们之间有复杂的相互交互时,中介者模式可以帮助简化对象之间的通信。
-
解耦对象:当需要减少对象之间的耦合,避免直接引用时,中介者模式提供了一种良好的解耦方案。
-
系统扩展:当需要对系统进行扩展时,添加新的对象或功能可以通过中介者进行,而无需修改其他对象的代码。
-
聊天系统:在一个聊天应用中,用户通过一个中介者(如聊天服务器)进行消息的发送和接收,从而避免了用户之间的直接交互。
注意点
-
中介者复杂性:如果中介者承担了过多的责任,可能导致中介者本身变得复杂,从而影响系统的可维护性。
-
性能问题:中介者可能会引入额外的性能开销,尤其是在处理大量消息时,需要合理设计中介者的实现。
-
中介者的角色:中介者模式适用于对象之间存在复杂交互的情况,而在简单交互的场景中,使用中介者可能显得多余。
核心要素
-
Mediator(中介者接口):定义与各个同事对象的交互接口。
-
ConcreteMediator(具体中介者):实现中介者接口,协调同事对象之间的交互。
-
Colleague(同事接口):定义同事对象的接口,通过中介者进行交互。
-
ConcreteColleague(具体同事):实现同事接口,具体的同事对象,使用中介者与其他同事进行交互。
Java代码完整示例
示例:简单的中介者模式实现
// 中介者接口
interface Mediator {
void register(Colleague colleague);
void send(String message, Colleague sender);
}
// 具体中介者
class ConcreteMediator implements Mediator {
private List<Colleague> colleagues = new ArrayList<>();
@Override
public void register(Colleague colleague) {
colleagues.add(colleague);
}
@Override
public void send(String message, Colleague sender) {
for (Colleague colleague : colleagues) {
// 不发送给发送者
if (colleague != sender) {
colleague.receive(message);
}
}
}
}
// 同事接口
abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void receive(String message);
}
// 具体同事A
class ConcreteColleagueA extends Colleague {
public ConcreteColleagueA(Mediator mediator) {
super(mediator);
}
@Override
public void receive(String message) {
System.out.println("ConcreteColleagueA received: " + message);
}
public void send(String message) {
System.out.println("ConcreteColleagueA sending: " + message);
mediator.send(message, this);
}
}
// 具体同事B
class ConcreteColleagueB extends Colleague {
public ConcreteColleagueB(Mediator mediator) {
super(mediator);
}
@Override
public void receive(String message) {
System.out.println("ConcreteColleagueB received: " + message);
}
public void send(String message) {
System.out.println("ConcreteColleagueB sending: " + message);
mediator.send(message, this);
}
}
// 客户端代码
public class MediatorPatternDemo {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator);
ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator);
mediator.register(colleagueA);
mediator.register(colleagueB);
colleagueA.send("Hello, B!");
colleagueB.send("Hi, A!");
}
}
输出结果:
ConcreteColleagueA sending: Hello, B!
ConcreteColleagueB received: Hello, B!
ConcreteColleagueB sending: Hi, A!
ConcreteColleagueA received: Hi, A!
各种变形用法完整示例
-
多个同事类型的交互
通过扩展同事对象的类型,允许更多的对象参与到中介者的交互中。
代码示例:多个同事类型
// 具体同事C class ConcreteColleagueC extends Colleague { public ConcreteColleagueC(Mediator mediator) { super(mediator); } @Override public void receive(String message) { System.out.println("ConcreteColleagueC received: " + message); } public void send(String message) { System.out.println("ConcreteColleagueC sending: " + message); mediator.send(message, this); } } public class MultiColleagueDemo { public static void main(String[] args) { ConcreteMediator mediator = new ConcreteMediator(); ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator); ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator); ConcreteColleagueC colleagueC = new ConcreteColleagueC(mediator); mediator.register(colleagueA); mediator.register(colleagueB); mediator.register(colleagueC); colleagueA.send("Hello, B and C!"); colleagueC.send("Hi, A and B!"); } }
-
中介者与同事的复杂交互
中介者可以实现更复杂的业务逻辑,如对消息进行过滤或修改。
代码示例:复杂交互
class EnhancedMediator implements Mediator { private List<Colleague> colleagues = new ArrayList<>(); @Override public void register(Colleague colleague) { colleagues.add(colleague); } @Override public void send(String message, Colleague sender) { // 简单的消息过滤 if (!message.contains("spam")) { for (Colleague colleague : colleagues) { if (colleague != sender) { colleague.receive(message); } } } else { System.out.println("Message blocked: " + message); } } } public class EnhancedMediatorDemo { public static void main(String[] args) { EnhancedMediator mediator = new EnhancedMediator(); ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator); ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator); mediator.register(colleagueA); mediator.register(colleagueB); colleagueA.send("Hello, B!"); colleagueB.send("spam message"); // 这条消息将被阻止 } }
-
中介者的状态管理
中介者可以维护状态信息,协调同事对象的状态。
代码示例:状态管理
class StateMediator implements Mediator { private List<Colleague> colleagues = new ArrayList<>(); private String state; @Override public void register(Colleague colleague) { colleagues.add(colleague); } public void setState(String state) { this.state = state; notifyColleagues(); } private void notifyColleagues() { for (Colleague colleague : colleagues) { colleague.receive("State updated to: " + state); } } @Override public void send(String message, Colleague sender) { // 这里可以实现其他交互逻辑 } } public class StateMediatorDemo { public static void main(String[] args) { StateMediator mediator = new StateMediator(); ConcreteColleagueA colleagueA = new ConcreteColleagueA(mediator); ConcreteColleagueB colleagueB = new ConcreteColleagueB(mediator); mediator.register(colleagueA); mediator.register(colleagueB); mediator.setState("Active"); } }
通过这些示例,中介者模式的灵活性和应用场景得以体现,可以根据具体需求实现多种变形用法。