大话设计模式——21.中介者模式(Mediator Pattern)

news2025/2/26 5:15:54

简介

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互

UML图

在这里插入图片描述

应用场景
  • 大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体
  • 用于一组对象以定义良好但是复杂的方式进行通信的场合,以及想定制一个分布在多个类中的行为而又不想生成太多的子类的场合

示例

联合国会议,用来处理世界各国的纠纷,联合国相当于中介者,各个国家在联合国进行谈判

  1. Mediator:
public abstract class UnitedNations {

    /**
     * 声明
     *
     * @param message 消息
     */
    public abstract void declare(String message,Country country);
}

理事会

public class UnitedNationsCouncil extends UnitedNations {


    /**
     * 国家1
     */
    private USA colleague1;

    /**
     * 国家2
     */
    private Iraq colleague2;

    public void setColleague1(USA colleague1) {
        this.colleague1 = colleague1;
    }

    public void setColleague2(Iraq colleague2) {
        this.colleague2 = colleague2;
    }

    @Override
    public void declare(String message, Country country) {
        if (country == colleague1) {
            // 国家1给国家2带的话
            colleague2.getMessage(message);
        } else {
            colleague1.getMessage(message);
        }
    }
}
  1. Colleague:国家
public abstract class Country {

    /**
     * 中介者
     */
    protected UnitedNations mediator;

    public Country(UnitedNations mediator) {
        this.mediator = mediator;
    }
}
public class Iraq extends Country {

    public Iraq(UnitedNations mediator) {
        super(mediator);
    }

    /**
     * 声明
     *
     * @param message
     */
    public void declare(String message) {
        mediator.declare(message, this);
    }

    /**
     * 获取信息
     *
     * @param message
     */
    public void getMessage(String message) {
        System.out.println("伊拉克得到对方的信息为:" + message);
    }
}
public class USA extends Country {


    public USA(UnitedNations mediator) {
        super(mediator);
    }

    /**
     * 声明
     *
     * @param message
     */
    public void declare(String message) {
        mediator.declare(message, this);
    }

    /**
     * 获取信息
     */
    public void getMessage(String message) {
        System.out.println("美国获取对方消息为:" + message);
    }
}
  1. 运行
public class Main {

    public static void main(String[] args) {
        // 充当中介 联合国理事会
        UnitedNationsCouncil nationsCouncil = new UnitedNationsCouncil();

        // 都认识联合国
        USA usa = new USA(nationsCouncil);
        Iraq iraq = new Iraq(nationsCouncil);

        // 联合国认识两个国家
        nationsCouncil.setColleague1(usa);
        nationsCouncil.setColleague2(iraq);

        // 两个国家发表声明
        usa.declare("停止开发核武器,否则接受打击");
        iraq.declare("我们没有开发核武器,也不怕侵略!");

    }
}

在这里插入图片描述

总结

  • 优点
    • 中介者的出现减少了Colleague之间的耦合,使得可以独立地改变和复用各个Colleague类和中介者
    • 由于把对象如何协作进行了抽象,将中介作为一个独立的改变并将其封装在一个对象中,将关注的对象从对象各自本身的行为转移到它们之间的交互上,可以从宏观角度去看待系统
  • 缺点
    • 由于中介者对象过度的集中化可能导致其复杂性大大增加,导致理解难度增加和可维护性降低

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1585425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis过期监听机制

转自:https://www.cnblogs.com/wangyunhong/articles/16505079.html 1.redis配置 1.打开conf/redis.conf 文件,取消注释:notify-keyspace-events Ex 2.重启redis 3.如果设置了密码需要重置密码:config set requirepass **** 3…

新鲜出炉!这一套二手平台管理系统,太牛了,直接领取【带源码】

​今天给大家分享一套基于SpringbootVue的二手平台管理系统源码,在实际项目中可以直接复用。(免费提供,文末自取) 一、系统运行图(设计报告和接口文档) 1、登陆页面 2、后台页面 3、设计报告包含接口文档 二、系统搭建视频教程 …

JVM常用参数一

jvm启动参数 JVM(Java虚拟机)的启动参数是在启动JVM时可以设置的一些命令行参数。这些参数用于指定JVM的运行环境、内存分配、垃圾回收器以及其他选项。以下是一些常见的JVM启动参数: -Xms:设置JVM的初始堆大小。 -Xmx&#xff1…

了解CSS中的BFC以及用法

目录 一 常见的定位方案 1. 普通流(所有元素默认为普通流的定位) 2. 浮动 3. 绝对定位 二 BFC 1. 定义 2. 触发条件 3. 作用 (1) 避免外边距重叠 ​(2)清除浮动 (3) 阻…

【知识扫盲】DHCP Server扫盲与作用

DHCP Server在实际应用中非常广泛,它适用于各种规模的网络环境,从小型办公室到大型企业网络,都能发挥重要作用。以下是一些具体的使用场景,用通俗易懂的语言进行解释。 1. 办公室网络环境 在一家公司的办公室里,通常会…

麒麟KOS删除鼠标右键新建菜单里不需要的选项

原文链接:麒麟KOS删除鼠标右键新建菜单里不需要的选项 Hello,大家好啊!在日常使用麒麟KOS操作系统时,我们可能会发现鼠标右键新建菜单里包含了一些不常用或者不需要的选项。这不仅影响我们的使用效率,也让菜单显得杂乱…

基于MPC的自动驾驶泊车控制

基于MPC的自动驾驶泊车控制 H. Ye, H. Jiang, S. Ma, B. Tang, and L. Wahab, “Linear model predictive control of automatic parking path tracking with soft constraints,” International Journal of Advanced Robotic Systems, vol. 16, no. 3, p. 附赠自动驾驶学习资…

Qt之QSS样式表

QSS简介 QSS(Qt Style Sheet)样式表是一种用于描述图形用户界面(GUI)样式的语言。它允许开发者为应用程序的控件定义视觉外观,例如颜色、字体、尺寸和布局等。 QSS 样式表的主要目的是提供一种简洁而灵活的方式来美化…

NzN的数据结构--栈的实现

在前面我们已经学习了哪些线性数据结构呢?大家一起来回顾一下:C语言学过的数组,数据结构中的线性表和顺序表和链表。那我们今天再来介绍数据结构里的两个线性结构--栈和队列。 目录 一、栈的概念及结构 二、用数组实现栈 1. 栈的初始化和…

Linux内核中常用的C语言技巧

Linux内核采用的是GCC编译器,GCC编译器除了支持ANSI C,还支持GNU C。在Linux内核中,许多地方都使用了GNU C语言的扩展特性,如typeof、__attribute__、__aligned、__builtin_等,这些都是GNU C语言的特性。 typeof 下面…

Web 前端性能优化之七:数据存储与缓存技术

7、数据存储 在开发Web应用的过程中,会涉及一些数据的存储需求,常见的存储方式可能有: 保存登录态的Cookie; 使用浏览器本地存储进行保存的Local Storage和Session Storage; 客户端数据持久化存储方案涉及的Web SQ…

Redis Cluster集群模式

目录 一、理论 1.1 概念 1.2 集群的作用 1.3 redis集群的数据分片 1.4 Redis集群的主从复制模型 二、实践 2.1 Redis集群模式的搭建 2.1.1 cluster集群前期工作 2.1.2 开启群集功能 2.1.3 启动redis节点 2.1.4 启动集群 2.2 测试集群 总结 一、理论 1.1 概念 集群&a…

pyside6的QSpinBox自定义特性初步研究(二)

当前的需求是,蓝色背景的画面,需要一个相对应色系的QSpinBox部件。已有的部件风格是这样的,需要新的部件与之般配。 首先新建一个QDoubleSpinBox,并定义其背景色和边框: QDoubleSpinBox { color: white; border:1px…

光学雨量计红外雨量传感器应用于小型气象站

光学雨量计红外雨量传感器应用于小型气象站 随着气候变化对人类生活和农业生产的影响越来越大,气象观测设备的需求也逐渐增加。其中一种常见的气象观测设备是雨量计,用于监测降水量。在小型气象站中,光学雨量计红外雨量传感器被广泛应用。 …

数据库知识点汇总(最全!,2024年最新大佬分享开发经验

十九、删除数据 DELETE 语句 使用 DELETE 语句从表中删除数据。 DELETE FROM table [WHERE condition]; 删除数据 使用 WHERE 子句删除指定的记录 DELETE FROM departments WHERE department_name ‘Finance’; 如果省略 WHERE 子句,则表中的全部数据将被删除 DELE…

ai智能问答免费API接口

智能对话API接口,可以为网站或其他产品提供强大的智能交互功能,无需自行开发复杂的语义分析和自然语言处理算法。这使得开发者能够更专注于产品的核心功能和用户体验,加速产品上线速度并降低开发成本。 智能对话API接口的功能还包括对话内容…

CentOS安装MeterSphere并实现无公网IP远程访问本地测试平台

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

VS运行.netcore项目,一般情况下都是用localhost访问,怎么做到用IP地址访问,步骤详解

一、问题描述 通常情况下运行起来都是这样 运行后效果 怎么做到下面这样呢? 二、解决办法 vs把项目运行起来之后,在电脑的右下角有一个图标,右键它 点击其中一个 进入applicationhost.config文件

Golang | Leetcode Golang题解之第14题最长公共前缀

题目&#xff1a; 题解&#xff1a; func longestCommonPrefix(strs []string) string {if len(strs) 0 {return ""}isCommonPrefix : func(length int) bool {str0, count : strs[0][:length], len(strs)for i : 1; i < count; i {if strs[i][:length] ! str0 …