中介者模式
中介者模式(Mediator Pattern)是一种行为设计模式,它通过引入一个中介者对象来封装多个对象之间的交互,降低对象之间的耦合度。中介者使各个对象不需要显式地相互引用,而是通过中介者来进行通信,这样可以减少系统的复杂性,提高可维护性和可扩展性。
类图
主要角色
- Mediator(中介者):定义一个接口,用于同事对象之间的通信。
- Colleague(同事):每个同事都知道中介者,并通过中介者与其他同事通信,而不是直接与其他同事通信。
- ConcreteMediator(具体中介者):实现中介者的接口,负责协调各同事对象之间的交互逻辑。
- ConcreteColleague(具体同事):实现同事接口,实现自身业务逻辑,通过中介者与其他同事交互。
使用场景
- 当系统中对象之间存在复杂的交互关系,导致对象之间紧密耦合,难以维护和扩展时,可以考虑使用中介者模式。
- 当一个对象需要和多个其他对象进行通信,但不希望直接依赖这些对象时,可以引入一个中介者对象来简化通信流程。
优点
- 降低了对象之间的耦合度,使得系统更易于维护和扩展。
- 将对象之间的交互集中到一个中介者对象中,使得系统的结构更清晰,易于理解。
- 可以方便地修改和扩展系统中的交互行为,而不需要修改每个相关对象。
缺点
- 中介者对象本身可能变得过于庞大,承担了过多的责任,导致单一职责原则被违反。
- 中介者模式可能会导致系统中出现大量的交互行为集中在一个对象中,使得该对象变得复杂且难以维护。
示例
java
package com.justin.mediator.basic;
// 中介者接口
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);
}
}
}
// 抽象同事类
abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator) {
this.mediator = mediator;
}
public abstract void send(String message);
public abstract void receiveMessage(String message);
}
// 具体同事类1
class ConcreteColleague1 extends Colleague {
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
@Override
public void send(String message) {
mediator.sendMessage(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("ConcreteColleague1 received message: " + message);
}
}
// 具体同事类2
class ConcreteColleague2 extends Colleague {
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
@Override
public void send(String message) {
mediator.sendMessage(message, this);
}
@Override
public void receiveMessage(String message) {
System.out.println("ConcreteColleague2 received message: " + message);
}
}
public class Test {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
mediator.setColleague1(colleague1);
mediator.setColleague2(colleague2);
colleague1.send("Hello from Colleague1");
colleague2.send("Hi from Colleague2");
}
}