本文共 2701 字,大约阅读时间需要 9 分钟。
中介者模式(Mediator_pattern)是一种软件设计模式,旨在通过引入一个中介对象来封装一系列对象之间的交互。这种设计使得各个对象之间不需要直接引用,从而减少了对象之间的耦合度。同时,中介者对象也为系统的扩展和优化提供了便利,因为可以独立地修改对象之间的交互方式。
中介者模式的核心是通过一个中介者对象(Mediator)来管理对象之间的交互。各个对象称为同事(Colleague),它们通过中介者向对方发送消息。这种结构将网状的复杂交互转化为以中介者为中心的星形结构,使得系统更易于管理和扩展。
public class Main { public static void main(String[] args) { ConcreteMediator m = new ConcreteMediator(); ConcreteColleague1 c1 = new ConcreteColleague1(m); ConcreteColleague2 c2 = new ConcreteColleague2(m); m.setColleague1(c1); m.setColleague2(c2); c1.send("吃过饭了吗"); c2.send("没有呢,你打算请客?"); }}abstract class Mediator { public abstract void send(String message, Colleague colleague);}abstract class Colleague { protected Mediator mediator; public Colleague(Mediator mediator) { this.mediator = mediator; }}class ConcreteMediator extends Mediator { private ConcreteColleague1 colleague1; private ConcreteColleague2 colleague2; public void setColleague1(ConcreteColleague1 colleague1) { this.colleague1 = colleague1; } public void setColleague2(ConcreteColleague2 colleague2) { this.colleague2 = colleague2; } @Override public void send(String message, Colleague colleague) { if (colleague == colleague1) { colleague2.notify(message); } else { colleague1.notify(message); } }}class ConcreteColleague1 extends Colleague { public ConcreteColleague1(Mediator mediator) { super(mediator); } @Override public void send(String message) { mediator.send(message, this); } @Override public void notify(String message) { System.out.println("同事1得到信息:" + message); }}class ConcreteColleague2 extends Colleague { public ConcreteColleague2(Mediator mediator) { super(mediator); } @Override public void send(String message) { mediator.send(message, this); } @Override public void notify(String message) { System.out.println("同事2得到信息:" + message); }}
中介者模式的核心优势在于它能够简化系统中复杂的对象交互关系。适用于以下场景:
联合国可以看作是一个典型的中介者例子。在联合国框架下,各个成员国通过中介者(联合国)与其他成员国进行沟通和协作,而不是直接与其他成员国互动。这种结构使得国际关系更加有序和可控。
通过中介者模式,系统可以将网状的复杂结构转换为有序的星形结构。每个具体对象不再需要直接与其他对象通信,而是通过中介者进行交互。这使得系统的结构更加灵活和可维护,能够在不需要重大修改的情况下添加新的对象或功能。
转载地址:http://gujzk.baihongyu.com/