目录
中介者模式定义
优点
缺点
结构说明
工作流程
代码练习
应用场景
本质
设计原则
相关设计模式
开源框架中的应用
中介者模式定义
用一个中介对象来封装一系列的对象交互。中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。
优点
-
减少耦合:中介者模式降低了对象之间的直接依赖关系,使得系统更加灵活、可维护和可扩展。
-
集中控制:中介者模式集中了对象之间的通信和控制,使得系统的行为更加可控。
-
复用性:中介者对象可以被多个同事对象共享,促进了代码的复用。
缺点
-
复杂性增加:引入中介者对象可能会增加系统的复杂性,因为它需要维护对象之间的通信关系。
-
中介者对象的单一性:中介者对象可能成为系统中的单点故障,一旦中介者对象出现问题,整个系统的通信将受到影响。
结构说明
-
中介者接口(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库中的窗口、按钮、文本框等组件可以是同事对象,而窗口管理器可以作为中介者,协调组件之间的事件处理。
-
航空交通管制系统:航空交通管制系统中的飞机、塔台等可以是同事对象,而空中交通控制中心可以作为中介者,协调飞机的飞行和降落。文章来源:https://uudwc.com/A/dby04
-
Spring框架 - 事件通知:Spring框架中的事件通知机制可以看作是一种中介者模式,其中事件发布者和事件监听者之间的通信由Spring框架负责管理。文章来源地址https://uudwc.com/A/dby04