目录
用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

减少耦合:中介者模式降低了对象之间的直接依赖关系,使得系统更加灵活、可维护和可扩展。
集中控制:中介者模式集中了对象之间的通信和控制,使得系统的行为更加可控。
复用性:中介者对象可以被多个同事对象共享,促进了代码的复用。
复杂性增加:引入中介者对象可能会增加系统的复杂性,因为它需要维护对象之间的通信关系。
中介者对象的单一性:中介者对象可能成为系统中的单点故障,一旦中介者对象出现问题,整个系统的通信将受到影响。
中介者接口(Mediator Interface):定义了中介者对象必须实现的方法,用于处理对象之间的交互。
具体中介者类(Concrete Mediator):实现了中介者接口,负责协调和管理各个同事对象之间的通信。
同事类(Colleague):每个同事对象都知道中介者对象,并与中介者通信。同事对象之间的通信不直接发生,而是通过中介者进行的。
各个同事对象将需要交互的信息发送给中介者。
中介者接收到信息后,根据信息的内容和发送者的身份,决定如何处理这些信息。
中介者将处理结果发送给相关的同事对象。
同事对象根据中介者发送的结果来执行相应的操作。
将对象之间的通信集中在一个中介者对象中,以减少对象之间的直接依赖关系。

1.创建中介者接口,提供对象交互使用的sendMessage()方法。
public interface Mediator {
void sendMessage(Colleague colleague, String message);
}
2.创建具体中介者,包含进行交互的同事对象。
public class ConcreteMediator implements Mediator{
protected Colleague colleague1;
protected Colleague colleague2;
@Override
public void sendMessage(Colleague colleague, String message) {
if (colleague == colleague1){
colleague2.receiveMessage(message);
} else if (colleague == colleague2) {
colleague1.receiveMessage(message);
}
}
public void setColleague1(Colleague colleague1) {
this.colleague1 = colleague1;
}
public void setColleague2(Colleague colleague2) {
this.colleague2 = colleague2;
}
}
3.创建抽象同事类,包含中介者引用。
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator mediator){
this.mediator = mediator;
}
public abstract void sendMessage(String message);
public abstract void receiveMessage(String message);
}
4.创建具体同事类。
public class ConcreteColleague1 extends Colleague{
public ConcreteColleague1(Mediator mediator) {
super(mediator);
}
@Override
public void sendMessage(String message) {
mediator.sendMessage(this,message);
}
@Override
public void receiveMessage(String message) {
System.out.println("colleague1 received message:" + message);
}
}
public class ConcreteColleague2 extends Colleague{
public ConcreteColleague2(Mediator mediator) {
super(mediator);
}
@Override
public void sendMessage(String message) {
mediator.sendMessage(this,message);
}
@Override
public void receiveMessage(String message) {
System.out.println("colleague2 received message:" + message);
}
}
5.客户端代码
public class MediatorClient {
public static void main(String[] args) {
ConcreteMediator mediator = new ConcreteMediator();
ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(mediator);
ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(mediator);
mediator.setColleague1(concreteColleague1);
mediator.setColleague2(concreteColleague2);
concreteColleague1.sendMessage("Hello from colleague1 ...");
concreteColleague2.sendMessage("Hi from colleague2 ...");
}
}
当多个对象之间存在复杂的相互依赖关系,而且这些对象之间的交互关系难以维护时,可以考虑使用中介者模式来简化交互。
当一个对象的改变需要影响其他多个对象的状态或行为时,中介者模式可以用于协调这些对象的交互。
当对象之间的通信方式需要松散耦合,以便可以轻松添加或修改对象时,中介者模式非常有用。
中介者模式的本质是将对象之间的通信集中在一个中介者对象中,以减少对象之间的直接依赖关系,实现松散耦合。
单一职责原则(Single Responsibility Principle):中介者模式有助于将对象的职责分离,每个对象专注于自己的任务,而不需要关心其他对象的详细实现。
中介者模式通常与观察者模式(Observer Pattern)结合使用,观察者模式用于实现同事对象和中介者之间的通信。此外,中介者模式也可以与单例模式(Singleton Pattern)结合使用,以确保中介者对象的单一性。
聊天应用程序:在一个多人聊天应用程序中,各个聊天参与者可以是同事对象,而聊天室可以作为中介者,负责协调消息的传递。
图形用户界面(GUI)库:GUI库中的窗口、按钮、文本框等组件可以是同事对象,而窗口管理器可以作为中介者,协调组件之间的事件处理。
航空交通管制系统:航空交通管制系统中的飞机、塔台等可以是同事对象,而空中交通控制中心可以作为中介者,协调飞机的飞行和降落。
Spring框架 - 事件通知:Spring框架中的事件通知机制可以看作是一种中介者模式,其中事件发布者和事件监听者之间的通信由Spring框架负责管理。