• 【行为型模式】中介者模式


    一、中介者模式概述

            中介者模式定义用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。(对象行为型模式)

    • 中介者模式的优缺点
      • 优点
        • 1.简化了对象之间的交互;
        • 2.将各同事解耦;
        • 3.减少子类生成;
        • 4.可以简化各同事类的设计和实现。
      • 缺点
        • 在具体中介者类中包含了同事之间的交互细节,可能会导致具体中介者类非常复杂,使得系统难以维护。
    • 适用环境
      • 1.系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解;
      • 2.一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象;
      • 3.想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象交互的公共行为,如果需要改变行为则可以增加新的中介者类
      • 4.我们所常知道的MVC模式中,controller就是我们所谓的中介者。

    二、代码实现

    中介者模式主要包含4个角色:

    • Mediator: 抽象中介者,是中介者的接口/抽象类;
    • ConcreteMediator: 具体中介者,中介者的具体实现,实现中介者接口,定义一个List来管理Colleague对象;
    • Colleague: 抽象同事类,定义同事类的接口/抽象类,保存中介者对象,实现同事类的公共方法;
    • ConcreteColleague: 具体同事类,实现抽象同事类。通过中介者间接完成具体同事类之间的通信交互。
            2.1 抽象中介者(Mediator)
    1. package Mediator.example;
    2. //抽象中介者
    3. public abstract class Mediator {
    4. /**注册同事类*/
    5. public abstract void register(Colleague colleague);
    6. /**处理接收逻辑*/
    7. public abstract void operation(Colleague colleague);
    8. }
            2.2 具体中介者(ConcreteMediator)
    1. package Mediator.example;
    2. import java.util.List;
    3. import java.util.ArrayList;
    4. //具体中介者类
    5. public class ConcreteMediator extends Mediator {
    6. private List colleagues = new ArrayList();
    7. @Override
    8. public void register(Colleague colleague) {
    9. // TODO Auto-generated method stub
    10. if (!colleagues.contains(colleague)) {
    11. colleagues.add(colleague);
    12. colleague.setMediator(this);
    13. }
    14. }
    15. @Override
    16. public void operation(Colleague colleague) {
    17. // TODO Auto-generated method stub
    18. for (Colleague coll : colleagues) {
    19. if (!coll.equals(colleague)) {
    20. coll.receive();
    21. }
    22. }
    23. }
    24. }
            2.3 抽象同事类(Colleague)
    1. package Mediator.example;
    2. //抽象同事类
    3. public abstract class Colleague {
    4. protected Mediator mediator;
    5. public void setMediator(Mediator mediator) {
    6. this.mediator = mediator;
    7. }
    8. public abstract void receive();
    9. public abstract void send();
    10. }
            2.4 具体同事类(ConcreteColleague1、ConcreteColleague2)
    1. package Mediator.example;
    2. //具体同事类1
    3. public class ConcreteColleague1 extends Colleague {
    4. @Override
    5. public void receive() {
    6. // TODO Auto-generated method stub
    7. System.out.println("具体同事类 ConcreteColleague1 接收请求");
    8. }
    9. @Override
    10. public void send() {
    11. // TODO Auto-generated method stub
    12. System.out.println("具体同事类 ConcreteColleague1 发送请求");
    13. /*中介者进行转发*/
    14. mediator.operation(this);
    15. }
    16. }
    1. package Mediator.example;
    2. //具体同事类2
    3. public class ConcreteColleague2 extends Colleague {
    4. @Override
    5. public void receive() {
    6. // TODO Auto-generated method stub
    7. System.out.println("具体同事类 ConcreteColleague2 接收到请求");
    8. }
    9. @Override
    10. public void send() {
    11. // TODO Auto-generated method stub
    12. System.out.println("具体同事类 ConcreteColleague2 发送请求");
    13. mediator.operation(this);
    14. }
    15. }
            2.5 客户端(Client)
    1. package Mediator.example;
    2. public class Client {
    3. public static void main(String[] args) {
    4. Mediator concreteMediator = new ConcreteMediator();
    5. Colleague concreteColleague1 = new ConcreteColleague1();
    6. Colleague concreteColleague2 = new ConcreteColleague2();
    7. concreteMediator.register(concreteColleague1);
    8. concreteMediator.register(concreteColleague2);
    9. concreteColleague1.send();
    10. concreteColleague2.send();
    11. }
    12. }
            2.6 UML图

    三、代码结构图

  • 相关阅读:
    好数组——尺取法
    使用Stable Diffusion生成艺术二维码
    C++读写Excel(xlnt库的使用)
    FMC子卡设计方案:FMC177-基于AD9361的双收双发射频FMC子卡
    学Python的漫画漫步进阶 -- 第十一步.常用的内置模块
    英语单词: truncate;截断警告
    基于SSM+MySQL+Layui的企业库存信息管理系统
    RabbitMQ初步到精通-第十一章-RabbitMQ之常见问题汇总
    Unity演示Leetcode开香槟过程
    如何利用无线远程通讯模块实现触摸屏与PLC间通信?
  • 原文地址:https://blog.csdn.net/qq_45276194/article/details/138121907