当前位置: 首页 > article >正文

【设计模式-中介者模式】

定义

中介者模式(Mediator Pattern)是一种行为设计模式,通过引入一个中介者对象,来降低多个对象之间的直接交互,从而减少它们之间的耦合度。中介者充当不同对象之间的协调者,使得对象之间的通信变得简单且集中。

UML图

在这里插入图片描述

  • Mediator(中介者接口):定义中介者与同事之间的交互方法。
  • ConcreteMediator(具体中介者):实现中介者接口,维护对同事对象的引用,并协调它们之间的交互。
  • Colleague(同事抽象类):通常持有对中介者的引用,通过中介者进行通信。
  • ConcreteColleague(同事类):具体的组件类,通常持有对中介者的引用,通过中介者进行通信。

代码

// Mediator interface
interface Mediator {
    void send(String message, Colleague colleague);
}

// Concrete Mediator
class ChatMediator implements Mediator {
    private List<Colleague> colleagues = new ArrayList<>();

    public void addColleague(Colleague colleague) {
        colleagues.add(colleague);
    }

    @Override
    public void send(String message, Colleague colleague) {
        for (Colleague c : colleagues) {
            // Prevent sending message back to the sender
            if (c != colleague) {
                c.receive(message);
            }
        }
    }
}

// Colleague interface
abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public abstract void send(String message);
    public abstract void receive(String message);
}

// Concrete Colleague
class User extends Colleague {
    private String name;

    public User(Mediator mediator, String name) {
        super(mediator);
        this.name = name;
    }

    @Override
    public void send(String message) {
        System.out.println(name + ": Sending message: " + message);
        mediator.send(message, this);
    }

    @Override
    public void receive(String message) {
        System.out.println(name + ": Received message: " + message);
    }
}

// Client code
public class MediatorPatternDemo {
    public static void main(String[] args) {
        ChatMediator mediator = new ChatMediator();

        User user1 = new User(mediator, "Alice");
        User user2 = new User(mediator, "Bob");

        mediator.addColleague(user1);
        mediator.addColleague(user2);

        user1.send("Hello Bob!");
        user2.send("Hi Alice!");
    }
}

优点

  • 降低耦合性:同事对象不需要直接引用彼此,减少了依赖关系。
  • 集中管理:所有的交互逻辑集中在中介者中,易于维护和修改。
  • 灵活性:可以方便地添加新的同事类或修改交互逻辑,而不需要改变其他类。

缺点

  • 中介者复杂性:中介者可能会变得复杂,尤其是当它需要处理多个同事对象时。
  • 扩展困难:添加新的同事类可能需要对中介者进行修改,从而影响系统的灵活性。

使用场景

  • 当多个对象之间的通信需要被集中控制时。
  • 当系统中存在大量同事对象,且它们之间的交互复杂时。
  • 当希望减少类之间的依赖关系,提升系统的可维护性时。

http://www.kler.cn/news/325073.html

相关文章:

  • EHS管理系统设备安全设施安全监控模块
  • 用manim实现有想法的Pi
  • 能力成熟度模型集成(CMMI)
  • c# 结构体反射赋值问题 结构体 反射赋值
  • 百度智能体创建:情感领域的创新力量
  • 大模型训练:K8s 环境中数千节点存储最佳实践
  • 车辆零部件检测和分割数据集-车体数据集-yolo格式-yolov5-yolov10可用
  • docker-图形化工具-portainer的使用
  • Vue $router.push打开新窗口
  • 【Linux网络】详解TCP协议(2)
  • 网站建设中常见的网站后台开发语言有哪几种,各自优缺点都是什么?
  • python和pyqt-tools安装位置
  • 【从零开始实现stm32无刷电机FOC】【实践】【7.1/7 硬件设计】
  • 【Golang】关于Go语言字符串转换strconv
  • 《牧神记》PV初体验,玄机科技再塑经典国漫
  • 学习C++的第七天!
  • 新建flask项目,配置入口文件,启动项目
  • OceanBase 一级表分区记录
  • 浅谈虚拟内存(操作系统、Redis)
  • matlab中在一个图上持续画多条曲线的方法
  • Qualitor processVariavel.php 未授权命令注入漏洞复现(CVE-2023-47253)
  • [Redis][持久化][上][RDB]详细讲解
  • 每天一个数据分析题(四百九十)- 主成分分析与因子分析
  • 7种限流算法打开新方式
  • Win32打开UWP应用
  • 数据库服务器该如何进行搭建?
  • Kali Linux上安装远程桌面服务VNC
  • 线性代数复习笔记
  • 指针(3)
  • 第18周 第1章Ajax基础知识