Java 设计模式——中介者模式

news2025/1/22 17:49:46

目录

  • 1.概述
  • 2.结构
  • 3.案例实现
    • 3.1.抽象中介类
    • 3.2.抽象同事类
    • 3.3.具体同事类
    • 3.4.具体中介类
    • 3.5.测试
  • 4.优缺点
  • 5.使用场景

1.概述

(1)一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中,有 6 个同事类对象,假如对象 1 发生变化,那么将会有 4 个对象受到影响。如果对象 2 发生变化,那么将会有 5 个对象受到影响。也就是说,同事类之间直接关联的设计是不好的。

(2)如果引入中介者模式,那么同事类之间的关系将变为星型结构,从下右图中可以看到,任何一个类的变动,只会影响的类本身,以及中介者,这样就减小了系统的耦合。一个好的设计,必定不会把所有的对象关系处理逻辑封装在本类中,而是使用一个专门的类来管理那些不属于自己的行为

在这里插入图片描述

(3)中介者模式 (Mediator Pattern) 是一种行为型设计模式,它允许对象通过一个中介对象来进行协作,而不是直接相互引用,从而降低对象之间的耦合度,同时提高代码的可维护性和可扩展性

2.结构

中介者模式包含以下主要角色:

  • 抽象中介者 (Mediator) 角色:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法。
  • 具体中介者 (Concrete Mediator) 角色:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事角色之间的交互关系,因此它依赖于同事角色。
  • 抽象同事类 (Colleague) 角色:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能。
  • 具体同事类 (Concrete Colleague) 角色:是抽象同事类的实现者,当需要与其他同事对象交互时,由中介者对象负责后续的交互。

3.案例实现

【例】租房:现在租房基本都是通过房屋中介,房主将房屋托管给房屋中介,而租房者从房屋中介获取房屋信息。房屋中介充当租房者与房屋所有者之间的中介者。其类图下:
在这里插入图片描述
具体实现代码如下:

3.1.抽象中介类

Mediator.java

//抽象中介者类
public abstract class Mediator {
    public abstract void constact(String message, Person person);
}

3.2.抽象同事类

Person.java

//抽象同事类
public abstract class Person {
    protected String name;
    protected Mediator mediator;
    
    public Person(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
}

3.3.具体同事类

//租房者
public class Tenant extends Person{
    public Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }
    
    //和中介沟通的方法
    public void constact(String message){
        mediator.constact(message, this);
    }
    
    //获取信息
    public void getMessage(String message){
        System.out.println("租房者" + name + "获取到的信息是:" + message);
    }
}

HouseOwner.java

//房主类
public class HouseOwner extends Person{
    public HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }
    
    //和中介沟通的方法
    public void constact(String message){
        mediator.constact(message,this);
    }
    
    //获取信息
    public void getMessage(String message){
        System.out.println("房主" + name + "获取到的信息是:" + message);
    }
}

3.4.具体中介类

MediatorStructure.java

//具体的中介者角色类
public class MediatorStructure extends Mediator {

    //聚合房主和具体的租房者对象
    private HouseOwner houseOwner;
    private Tenant tenant;

    public HouseOwner getHouseOwner() {
        return houseOwner;
    }

    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }

    public Tenant getTenant() {
        return tenant;
    }

    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }

    @Override
    public void constact(String message, Person person) {
        if (person == houseOwner) {
            tenant.getMessage(message);
        } else {
            houseOwner.getMessage(message);
        }
    }
}

3.5.测试

Client.java

public class Client {
    public static void main(String[] args) {
        //创建中介者对象
        MediatorStructure mediator = new MediatorStructure();
    
        //创建租房者对象
        Tenant tenant = new Tenant("李四", mediator);
        //创建房主对象
        HouseOwner houseOwner = new HouseOwner("张三", mediator);
    
        //中介者要知道具体的房主和租房者
        mediator.setTenant(tenant);
        mediator.setHouseOwner(houseOwner);
    
        tenant.constact("我要租三室的房子!");
        houseOwner.constact("我这里有三室的房子,你要租吗?");
    }
}

输出结果如下:

房主张三获取到的信息是:我要租三室的房子!
租房者李四获取到的信息是:我这里有三室的房子,你要租吗?

4.优缺点

(1)中介者模式的优点包括:

  • 减少对象之间的直接耦合:通过引入中介者对象,各个对象不再直接相互引用,而是通过中介者来协调和管理交互,从而降低了对象之间的依赖程度。
  • 简化对象的交互逻辑:中介者模式将对象之间的交互行为集中在中介者对象中实现,各个对象只需要与中介者进行通信,不需要了解其他对象的具体细节,从而简化了对象之间的交互逻辑。
  • 提高系统的可维护性和可扩展性:通过降低对象之间的耦合度,中介者模式使系统更加灵活和易于维护。当系统需要新增一些交互行为时,只需要修改中介者对象即可,无需修改各个同事对象。
  • 促进代码重用:中介者模式可以将对象之间公共的交互行为抽象到中介者对象中,从而可以更好地复用代码。

(2)中介者模式的缺点包括:

  • 中介者对象可能会变得复杂:随着系统中的对象和交互行为增多,中介者对象可能会承担过多的责任,变得复杂和庞大。
  • 中介者模式可能导致性能问题:因为所有的交互行为都通过中介者进行,所以中介者可能成为系统的瓶颈,导致性能问题。
  • 增加了系统的复杂性:中介者模式增加了一个新的抽象层次,引入了中介者对象,使系统的架构更加复杂,对于简单的交互行为并不适用。

(3)所以在使用中介者模式时,需要权衡其优势和缺点,并根据具体情况进行选择。它适用于对象之间的交互关系复杂、需要集中管理和协调的场景,但对于简单的交互行为,可能会过于繁琐和不必要。

5.使用场景

(1)中介者模式适用于以下场景:

  • 对象之间的交互关系复杂:当系统中的对象之间存在复杂的交互关系,很难直接进行管理和协调时,可以引入中介者模式来简化和集中管理对象之间的交互行为。
  • 需要减少对象之间的耦合度:当对象之间的直接引用和依赖关系较多,难以维护和扩展时,可以使用中介者模式来解耦对象之间的关系,通过统一的中介者来进行交互。
  • 多个对象共享一些公共行为或信息:当多个对象需要共享某些公共行为或信息,并且希望集中管理和协调这些行为或信息时,可以使用中介者模式。
  • 多个对象之间的交互频繁:当多个对象之间频繁进行交互,且存在复杂的交互逻辑时,可以使用中介者模式来简化交互过程,提高代码的可维护性和可扩展性。

(2)一些常见的应用中介者模式的场景包括:

  • 图形界面中的 MVC 模式:在 MVC 模式中,中介者模式用于协调视图、模型和控制器之间的交互。
  • 多人在线游戏系统:在多人在线游戏中,中介者模式可以用于处理玩家之间的交互、通信和协作。
  • 航空管制系统:在航空管制系统中,中介者模式可以用于协调不同飞机之间的通信、路径规划和冲突解决。
  • UI 组件库:在构建 UI 组件库或框架时,中介者模式可以用于统一管理组件之间的交互行为,从而提供统一的接口和规范。

(3)总之,中介者模式适用于需要集中管理和协调对象之间交互关系的复杂场景,以提高系统的灵活性、可维护性和可扩展性。

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

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

相关文章

Redis最新2023年面试题高级面试题及附答案解析(2)【Redis最新2023年面试题高级面试题及附答案解析-第三十九刊】

文章目录 Redis最新2023年面试题高级面试题及附答案解析(2)01、Redis 集群方案应该怎么做?都有哪些方案?02、Redis 的内存用完了会发生什么?03、怎么测试 Redis 的连通性?04、Redis 集群会有写操作丢失吗?为什么&#…

C/C++ 实现获取硬盘序列号

获取硬盘的序列号、型号和固件版本号,此类功能通常用于做硬盘绑定或硬件验证操作,通过使用Windows API的DeviceIoControl函数与物理硬盘驱动程序进行通信,发送ATA命令来获取硬盘的信息。 以下是该程序的主要功能和流程: 定义常量…

青年作家考公引热议,体制内可能不是你想的那样

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 阿福 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 场地支持 / 声湃轩天津录音间 最近,班宇、陈春成、王苏辛三名青年作家出现在了武汉市文联所属事业单位专项招聘拟聘用人员名…

如何有效防止公司内部的信息泄露?

信息泄露对公司可能带来严重影响,因此采取一系列措施以确保信息安全至关重要。以下是一些建议: 部署综合的防泄密软件: 在公司内部,使用专业的防泄密软件如华企盾DSC系统,涵盖文件加密、U盘管控、桌面行为管理、日志审…

前端 react 面试题 (一)

文章目录 vue与react的区别。react的生命周期有哪些及它们的作用。setState是同步的还是异步的。如何更新数据后,立刻获取最新的dom或者更新后的数据。使用回调函数:在生命周期方法中处理: 函数式组件和class组件的区别。class组件函数式组件…

浏览器怎么更新?4个高效设置方法!

“我在使用浏览器时,有时候会提示说浏览器版本太低,需要更新后才能使用。有什么方法可以更新浏览器呢?快给我支支招吧!” 在快速发展的科技时代,浏览器更新是确保网络安全和性能优化的关键步骤。如果浏览器的版本太低&…

windows系统下修改nginx配置后reload重加载后不生效解决方案

windows系统下修改nginx配置后reload重加载后不生效解决方案 1、Nginx配置在重启(reload)后也不生效的原因2、通过服务启动的Nginx,通过stop命令是关闭不了的:(Access is denied)。 1、Nginx配置在重启(reload&#xf…

大语言模型量化方法对比:GPTQ、GGUF、AWQ

在过去的一年里,大型语言模型(llm)有了飞速的发展,在本文中,我们将探讨几种(量化)的方式,除此以外,还会介绍分片及不同的保存和压缩策略。 说明:每次加载LLM示例后,建议清除缓存,以…

前端跨界面之间的通信解决方案

主要是这两个方案,其他的,还有 SharedWorker 、IndexedDB、WebSocket、Service Worker 如果是,父子嵌套 iframe 还可以使用 window.parent.postMessage(“需要传递的参数”, ‘*’) 1、localStorage 核心点 同源,不能跨域(协议、端…

9.MyBatis-Plus

1、前期准备 a. 创建数据库 CREATE TABLE USER (id BIGINT(20)NOT NULL COMMENT 主键ID,NAME VARCHAR(30)NULL DEFAULT NULL COMMENT 姓名,age INT(11)NULL DEFAULT NULL COMMENT 年龄,email VARCHAR(50)NULL DEFAULT NULL COMMENT 邮箱,PRIMARY KEY (id) );INSERT INTO user…

短路语法 [SUCTF 2019]EasySQL1

打开题目 输入字符的时候啥也不回显。只有输入数字的时候页面有回显 但是当我们输入union,from,sleep,where,order等,页面回显nonono,很明显过滤了这些关键词 最开始我的思路是打算尝试双写绕过 1;ununion…

TS-08-A-2D、TS-08-B-1H插装式电磁比例溢流阀放大器

TS-08-A-2D、TS-08-B-1H插装式电磁比例溢流阀放大器持续的电磁铁、高效能的电磁铁结构、可选的线圈电压和终端、工业化通用插孔、紧凑的结构。 螺纹插装式、先导滑阀式减压溢流阀,利用可变电流输入可实现指定范围内的输出压力连续调节。输出压力与 DC 电流输入成比…

[Jenkins] 物理机 安装 Jenkins

这里介绍Linux CentOS系统直接Yum 安装 Jenkins,不同系统之间类似,操作命令差异,如:Ubuntu用apt; 0、安装 Jenkins Jenkins是一个基于Java语言开发的持续构建工具平台,主要用于持续、自动的构建/测试你的软…

Linux学习教程(第三章 Linux文件和目录管理)1

第三章 Linux文件和目录管理(初识Linux命令) 对初学者来说,管理 Linux 系统中的文件和目录,是学习 Linux 至关重要的一步。 为了方便管理文件和目录,Linux 系统将它们组织成一个以根目录 / 开始的倒置的树状结构。Li…

【架构师】的修炼之道都需要学习哪些?看看这些就够了

👨‍🎓博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…

代码随想录图论|130. 被围绕的区域 417太平洋大西洋水流问题

130. 被围绕的区域 **题目:**给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 题目链接:130. 被围绕的区域 解题思路&#xff1a…

《向量数据库指南》——2023云栖大会现场,向量数据库Milvus Cloud成关注焦点

近期,广受关注的2023 云栖大会正式收官,来自全球各地的开发者集聚一堂,共同探索 AI 时代的更多可能性。 云栖大会是由阿里巴巴集团主办的科技盛宴,是中国最早的开发者创新展示平台。据悉,今年云栖大会的主题为“计算,为了无法计算的价值”,共吸引了全球 44 个国家和地区…

用封面预测书的价格【图像回归】

今天,我将介绍计算机视觉的深度学习应用,用封面简单地估算一本书的价格。 我没有看到很多关于图像回归的文章,所以我为你们写这篇文章。 距离我上一篇文章已经过去很长时间了,我不得不承认,作为一名数据科学家&#x…

OceanBase杨冰:完全自研,才能逢山开路遇水搭桥

11月16日,在OceanBase2023年度发布会上,OceanBase CEO杨冰介绍,中国数字经济的蓬勃发展催生了对分布式数据库的强大需求,这种需求也牵引了OceanBase坚定投入自主研发,从而推动树立了分布式数据库的四项新标准。 据了解…

Harmony SDK API 版本 与 Harmony OS 版本对照表,及如何查看鸿蒙手机Harmony SDK Api 版本

Harmony SDK API 版本 与 Harmony OS 版本对照表 Harmony OSHarmony SDK APIHarmony 4.09Harmony 3.19Harmony 3.08Harmony 3.0 pre7Harmony 2.2.06Harmony 2.1.05Harmony 2.04 具体到真机上可能会有差异,如我的手机OS版本是2.0,按照上面表应该是4&…