关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

深入浅出设计模式 - 中介者模式

发布时间:2023-06-28 17:00:40
博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家 Java知识图谱点击链接:体系化学习Java(Java面试专题) 感兴趣的同学可以收藏关注下 ,不然下次找不到哟 1、什么是中介者模式 中介者模式是一种行为型设计模式,用于降低多个对象之间的耦合性。在中介者模式中,多个对象之间不直接相互通信,而是通过一个中介者对象进行通信。中介者对象封装了对象之间的交互逻辑,使得对象之间的通信变得简单而灵活。 中介者模式的核心思想是将对象之间的交互逻辑集中管理,避免了对象之间的直接依赖关系,从而提高了系统的可维护性和扩展性。通过引入中介者对象,可以将系统中复杂的交互关系变为多个简单的一对多关系,使得系统更易于理解和维护。 2、中介者模式的优缺点 中介者模式的优点包括: 降低了对象之间的耦合性:中介者模式将对象之间的交互逻辑集中在中介者对象中,使得对象之间不直接相互通信,从而降低了对象之间的耦合性。 简化了对象之间的交互:通过引入中介者对象,可以将复杂的交互关系变为多个简单的一对多关系,使得对象之间的通信变得简单而灵活。 提高了系统的可维护性和扩展性:由于对象之间的交互逻辑集中在中介者对象中,当系统需要修改交互逻辑时,只需修改中介者对象而不影响其他对象,提高了系统的可维护性和扩展性。 促进了代码复用:中介者模式将对象之间的通信逻辑集中在中介者对象中,使得这些逻辑可以被多个对象共享和复用。 中介者模式的缺点包括: 中介者对象可能会变得复杂:随着系统中对象之间的交互关系增多,中介者对象可能会变得复杂,包含大量的逻辑和方法。 中介者模式可能导致单点故障:由于多个对象之间的通信都依赖于中介者对象,如果中介者对象出现问题,可能会导致整个系统的功能受影响。 中介者模式可能降低系统的性能:由于中介者对象需要处理多个对象之间的通信,可能会导致系统的性能下降。 因此,在使用中介者模式时,需要权衡其优点和缺点,根据具体的场景来选择是否使用该模式。 3、中介者模式的应用场景 中介者模式适用于以下场景: 多个对象之间存在复杂的交互关系:当系统中多个对象之间存在复杂的交互关系,并且彼此之间的通信逻辑较为复杂时,可以使用中介者模式将这些交互逻辑集中在中介者对象中,简化对象之间的通信。 系统中对象之间的耦合性较高:当系统中的对象之间的耦合性较高,彼此之间的依赖关系较为复杂时,可以使用中介者模式将对象之间的交互逻辑解耦,通过引入中介者对象来降低对象之间的耦合性。 系统中的对象需要进行集中管理:当系统中的对象需要进行集中管理,例如需要对对象之间的通信进行调度、协调或控制时,可以使用中介者模式来管理这些对象。 系统中的对象之间的交互频繁且复杂:当系统中的对象之间的交互频繁且交互逻辑较为复杂时,可以使用中介者模式将这些复杂的交互逻辑集中在中介者对象中,提高系统的可维护性和扩展性。 系统中的对象之间存在循环依赖:当系统中的对象之间存在循环依赖关系,导致彼此之间难以直接通信时,可以使用中介者模式将这些循环依赖关系转化为一对多的关系,通过中介者对象来解决通信问题。 总之,中介者模式适用于对象之间存在复杂的交互关系、耦合性较高、需要集中管理、交互频繁且复杂、存在循环依赖等场景。通过引入中介者对象,可以简化对象之间的通信,提高系统的可维护性和扩展性。 4、中介者模式的结构 中介者模式的结构包括以下几个角色: 抽象中介者(Abstract Mediator):定义了中介者的接口,声明了各个同事对象之间通信的方法。 具体中介者(Concrete Mediator):实现了抽象中介者接口,协调各个具体同事对象之间的交互关系。 抽象同事类(Abstract Colleague):定义了同事类的接口,维护一个抽象中介者的引用,用于与其他同事对象进行通信。 具体同事类(Concrete Colleague):实现了抽象同事类的接口,具体同事对象之间通过中介者进行通信。 中介者模式的结构图如下: | Abstract Mediator | +---------------------+ | + doSomething() | | + colleagueChanged()| +---------------------+ /_\ | | +------------------+ | Concrete | | Mediator | +------------------+ | + doSomething() | | + colleague1 | | + colleague2 | +------------------+ /_\ | | +-------------------------+ | Abstract Colleague | +-------------------------+ | + mediator | | + send(message) | | + receive(message) | +-------------------------+ /_\ | | +-------------------------+ | Concrete Colleague 1 | +-------------------------+ | + send(message) | | + receive(message) | +-------------------------+ /_\ | | +-------------------------+ | Concrete Colleague 2 | +-------------------------+ | + send(message) | | + receive(message) | +-------------------------+ 在中介者模式中,抽象中介者定义了中介者的接口,具体中介者实现了该接口,并负责协调各个具体同事对象之间的交互关系。抽象同事类定义了同事类的接口,具体同事类实现了该接口,并通过中介者进行通信。通过中介者对象,各个同事对象之间的交互被集中在中介者对象中,从而降低了对象之间的耦合性。 5、中介者模式的原理 中介者模式的原理是通过引入一个中介者对象,将多个对象之间的交互行为集中管理和调度。在中介者模式中,各个对象之间不直接相互通信,而是通过中介者来进行通信和协调。 当各个对象之间需要进行复杂的通信和交互时,如果直接让它们相互引用,会导致对象之间的耦合度很高,难以维护和扩展。而中介者模式通过引入中介者对象,将对象之间的交互行为解耦,使得对象之间的通信通过中介者进行,从而简化了对象之间的关系。 中介者模式的核心思想是将对象之间的通信集中管理,通过中介者对象来协调各个对象之间的交互。当一个对象需要与其他对象进行通信时,它不需要直接与其他对象交互,而是通过中介者来发送和接收消息。中介者负责将消息传递给目标对象,并处理各个对象之间的交互逻辑。 通过中介者模式,可以实现一对多的关系,即一个中介者对象可以管理多个对象之间的交互。当一个对象发生变化时,只需要通知中介者对象,中介者对象会负责将变化传递给其他相关的对象。这样,对象之间的关系变得灵活可扩展,各个对象之间的耦合度也降低了。 总结来说,中介者模式通过引入中介者对象,将对象之间的通信和交互行为集中管理,解耦了对象之间的关系,提高了系统的灵活性和可扩展性。 6、中介者模式的代码案例 以下是一个简单的中介者模式的代码案例: package com.pany.camp.design.principle.mediator; /** * * @description: 接口类 * @copyright: @Copyright (c) 2022 * @company: Aiocloud * @author: pany * @version: 1.0.0 * @createTime: 2023-06-28 15:59 */ public interface Mediator { void sendMessage(String message, Colleague colleague); } package com.pany.camp.design.principle.mediator; /** * * @description: 具体中介者类 * @copyright: @Copyright (c) 2022 * @company: Aiocloud * @author: pany * @version: 1.0.0 * @createTime: 2023-06-28 16:00 */ 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 if (colleague == colleague2) { colleague1.receiveMessage(message); } } } package com.pany.camp.design.principle.mediator; /** * * @description: 抽象同事类 * @copyright: @Copyright (c) 2022 * @company: Aiocloud * @author: pany * @version: 1.0.0 * @createTime: 2023-06-28 16:00 */ 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); } package com.pany.camp.design.principle.mediator; /** * * @description: 具体同事类 * @copyright: @Copyright (c) 2022 * @company: Aiocloud * @author: pany * @version: 1.0.0 * @createTime: 2023-06-28 16:01 */ public class ConcreteColleague1 extends Colleague { public ConcreteColleague1(Mediator mediator) { super(mediator); } @Override public void sendMessage(String message) { mediator.sendMessage(message, this); } @Override public void receiveMessage(String message) { System.out.println("ConcreteColleague1 received message: " + message); } } package com.pany.camp.design.principle.mediator; /** * @description: 具体同事类 * @copyright: @Copyright (c) 2022 * @company: Aiocloud * @author: pany * @version: 1.0.0 * @createTime: 2023-06-28 16:01 */ public class ConcreteColleague2 extends Colleague { public ConcreteColleague2(Mediator mediator) { super(mediator); } @Override public void sendMessage(String message) { mediator.sendMessage(message, this); } @Override public void receiveMessage(String message) { System.out.println("ConcreteColleague2 received message: " + message); } } package com.pany.camp.design.principle.mediator; /** * * @description: 客户端 * @copyright: @Copyright (c) 2022 * @company: Aiocloud * @author: pany * @version: 1.0.0 * @createTime: 2023-06-28 16:01 */ public class Client { 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.sendMessage("Hello from colleague1"); colleague2.sendMessage("Hi from colleague2"); } } 我们定义了一个中介者接口Mediator和具体中介者类ConcreteMediator。抽象同事类Colleague定义了同事类的基本行为,具体同事类ConcreteColleague1和ConcreteColleague2继承自Colleague并实现了具体的行为。在测试代码中,我们创建了中介者对象和两个具体同事对象,并将它们注册到中介者中。然后,通过调用同事对象的sendMessage方法发送消息,中介者会根据发送消息的同事对象将消息传递给其他同事对象。最后,每个具体同事对象接收到消息后会进行相应的处理。 这个简单的示例展示了中介者模式的基本原理和用法。实际应用中,中介者模式可以用于更复杂的对象之间的通信和协调。 输出结果如下: ConcreteColleague2 received message: Hello from colleague1 ConcreteColleague1 received message: Hi from colleague2 Process finished with exit code 0 本文由激流原创,原创不易,感谢支持喜欢的话记得点赞收藏啊

/template/Home/leiyu/PC/Static