Java设计模式-中介模式/中介模式具体怎么使用,使用场景又是什么

news2024/11/17 16:32:49

继续整理记录这段时间来的收获,详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用!

6.8 中介者模式

6.8.1 定义

调停模式,定义一个中介角色来封装一系列对象的之间交互,使元有对象之间的耦合松散,且可以独立改变它们之间的交互

6.8.2 结构

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

6.8.3 案例实现(租房客)

  • 抽象中介者
public abstract class Mediator {  
//    沟通方法  
    abstract void contract(String message,Person person);  
}
  • 具体中介者角色
public class MediatorStructure extends Mediator{  
    Tenant tenant;  
    HouseOwner houseOwner;  
    public Tenant getTenant() {  
        return tenant;  
    }  
    public void setTenant(Tenant tenant) {  
        this.tenant = tenant;  
    }  
    public HouseOwner getHouseOwner() {  
        return houseOwner;  
    }  
    public void setHouseOwner(HouseOwner houseOwner) {  
        this.houseOwner = houseOwner;  
    }  
    @Override  
    void contract(String message, Person person) {  
        if(person == houseOwner)  
            houseOwner.getMessage(message);  
        if(person == tenant)  
            tenant.getMessage(message);  
    }  
}
  • 抽象同事类
public abstract class Person {  
    String name;  
    Mediator mediator;  
    public Person(String name, Mediator mediator) {  
        this.name = name;  
        this.mediator = mediator;  
    }  
    //    获取信息方法  
    abstract void getMessage(String message);  
}
  • 具体同事类角色
public class HouseOwner extends Person{  
    public HouseOwner(String name, Mediator mediator) {  
        super(name, mediator);  
    }  
    //    租客获得信息  
    @Override  
    public void getMessage(String message) {  
        System.out.println("房主" + name + "获得信息是:" +message);  
    }  
    //    与中介沟通  
    public void contract(String message){  
        mediator.contract(message,this);  
    }  
}

public class Tenant extends Person{  
    public Tenant(String name, Mediator mediator) {  
        super(name, mediator);  
    }  
//    租客获得信息  
    @Override  
    public void getMessage(String message) {  
        System.out.println("租客" + name + "获得信息是:" +message);  
    }  
//    与中介沟通  
    public void contract(String message){  
        mediator.contract(message,this);  
    }  
}
  • 测试
    public static void main(String[] args) {  
//        创建中介者对象  
        MediatorStructure mediatorStructure = new MediatorStructure();  
//        创建租客  
        Tenant tenant = new Tenant("张三",mediatorStructure);  
//        创建房客  
        HouseOwner houseOwner = new HouseOwner("李四",mediatorStructure);  
        //        交与中介者  
        mediatorStructure.setTenant(tenant);  
        mediatorStructure.setHouseOwner(houseOwner);  
//        各自信息  
        tenant.contract("需要一室一厅房子");  
        houseOwner.contract("我有一室一厅房子");  
    }
  • 结果
    ![[Pasted image 20230116155527.png]]- 类图![[Pasted image 20230116155549.png]]

6.8.4 优缺点

6.8.4.1 优点

  • 松散耦合:将多个同事对象之间的交互封装到中介者对象,使得同事对象之间松耦合
  • 集中控制交互:多同事对象交互,被封装到中介者对象集中管理,使得交互行为发生变化时仅仅需要修改中介者对象,扩展也需要修改中介者对象
  • 一对多关联转变为一对一关联

6.8.4.2 缺点

同事类太多,中介者职责很大,会变得复杂而庞大,至于系统难维护

6.8.5 使用场景

  • 系统中对象之间存在负责的引用关系,系统结构混乱且难以理解
  • 当创建一个运行于多个类之间的对象,又不想生成新的子类时

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

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

相关文章

2023年春节祝福第二弹——送你一只守护兔,让它温暖每一个你【html5 css3】画会动的小兔子,炫酷充电,字体特效

2023年春节祝福第二弹 送你一只守护兔,让它温暖每一个你! 【html5 css3】画一只会动的兔子 目录 一、送你一只守护兔,效果图 二、前言 三、代码解释及部分特效教程 (1)、css3 立体字 (2)…

普中科技MicroPython基于esp32的基础教程-01

课程链接 3.5-Python基础--代码注释_哔哩哔哩_bilibili 学习目的 复习和加深对Python的学习和使用,将Python的使用融汇于硬件使用中。因此笔记记录的内容都是我之前遗忘的或者重要的知识点,选择性记录视频笔记,在开发的过程中对于遗忘的知识…

基于Power BI的终端产品销售ABC分析

一、原理 ABC分析,是由帕累托法则演化而来,一般认为A类产品带来70%的收入,B类产品带来20%的收入,C类产品带来10%的收入,所以ABC分析又称70/20/10分析。 二、数据源 某终端《8~10月商品月台帐》 问题: 1…

计算机网络——UDP与TCP

一、运输层的作用 运输层在整个网络体系结构中位于面向通信部分的最高层,同时也是用户功能中的最低层。它提供的是应用进程间的逻辑通信。所谓逻辑通信,指的是它屏蔽了下层网络的细节,使得进程看见的就是好像在两个运输层实体之间有一条端到…

二分、复杂度、动态数组、哈希表

1.二分法 不一定一定有序,比如找局部最小值就可以不有序 有序数组中找到num 用对数器生成随机数组来校验find()方法是否正确 public class Code01_BSExist {//有序数组中找到num//arr保证有序public static boolean find(int[] arr, int num) {if (arr null || …

1594_AURIX_TC275_PMU_应用提示1

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 这一页主要是描述了当前的PMU版本与之前就版本相比之下的变更,对于第一次接触了解这个模块来说,其实了解前面的基本特性就好了。而这个差异,没有细看的必…

2023年网络安全比赛--Linux渗透测试中职组(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.通过本地PC中渗透测试平台Kali对靶机场景进行系统服务及版本扫描渗透测试,并将该操作显示结果中Apache服务对应的版本信息字符串作为Flag值提交; 2.通过本地PC中渗透测试平台Kali对靶机场景进行渗透测试,将该场景/var/www/ht…

Ubuntu安装Redis最新版本

使用ubuntu自带的安装工具安装的redis并不是最新版本,在最近的项目中需要最新版本的redis所以需要手动安装,再次记录下安装过程 备份数据 首先如果当前的虚拟机已经安装过redis,那么卸载当前的安装的版本,同时注意备份数据,redis 的备份数据的默认路径如下: /var/lib/redis 具…

FFmpeg 将多张图片编码成视频

前言 本篇文章的需求是将相机获取到的图片进行编码,编码成一个视频,耗费了大约一个星期的时间在解决各种问题。这里阐述一下这篇文章所要解决的几个问题: 1、如何将多张图片编码成视频。 2、如何进行定时录制视频。 3、同时开启多线程进行视…

吴恩达机器学习课程笔记:正规方程法

1.吴恩达机器学习课程笔记:正规方程法 笔记来源: 1.吴恩达机器学习课程笔记:正规方程法 2.神经网络 - 多元线性回归 - 正规方程法 仅作为个人学习笔记,若各位大佬发现错误请指正 正规方程法区别于梯度下降法的迭代求解&#xff0…

基于 SSH 协议配置 Git 连接 GitHub

文章目录0.安装 Git1.注册 GitHub 账号2.配置 Git 的用户名和邮箱3.基于 SSH 协议远程连接 GitHub3.1 为本机生成 SSH 密钥对3.2 将公钥拷贝到 GitHub 上3.3 SSH 测试3.4 将文件上传到 GitHub 的远程仓库0.安装 Git Git 官网链接:https://git-scm.com/ Git 官网下…

[QMT]01-我的第一个Python策略

新年立个Flag 学写50个QMT策略:新建一个 Python 策略创建方法:我的主页-新建策略删掉模板带的内容,输入第一个策略 01-HelloWorld:编写 Python 策略需在开始时定义编码格式,如 gbk。Init 方法和 handlebar 方法的定义是必须的。上图展示了如何在 QMT 系统…

微信小程序---分包

1.什么是分包 分包指的是把一个完整的小程序项目,按照需求划分为不同的子包,在构建时打包成不同的分包,用户在使用时按需进行加载。 2.分包的好处 对小程序进行分包的好处主要有以下两点: 可以优化小程序首次启动的下载时间在多团队共同开…

Git使用详解(图文+代码):Git分支

Git分支不过如此前言什么是分支分支的新建与合并分支的新建与切换分支的合并遇到冲突时的分支合并分支的管理先写到这了,肝不动了。这几天每天都抽时间更新一点前言 每一种版本控制都以某种形式支持分支。 使用分支的好处就是你可以从开发主线上分离开来&#xff0…

Visusl Studio 2019 使用Sqlite3

1. 下载访问官网下载页面(Sqlite 官方下载),从Window区下载编译好的动态库和头文件。动态库(根据实际需要选择32或64位版本):解压得到:源码文件:解压得到(当然我们只需要sqlite3.h)&…

V4L2 摄像头应用

1.V4L2 是 Video for linux two 的简称,是 Linux 内核中视频类设备的一套驱动框架,为视频类设备驱动开发和应用层提供了一套统一的接口规范。2.使用 V4L2 设备驱动框架注册的设备会在 Linux 系统/dev/目录下生成对应的设备节点文件,设备节点的…

前端HTML5

什么是HTML? 超文本标记语言,它是用来描述网页的一种语言HTML不是一种编程语言,而是一种标记语言标记语言是一种标记标签 浏览器内核 浏览器内核(渲染引擎):负责读取网页内容,整理讯息&#xf…

双方案-基于Mysql 与 ElasticSearch实现关键词提示搜索与全文检索

文章目录前言Mysql检索简述原理其他索引构建实例代码搜索流程搜索ElasticSearch 实现环境配置编码查询与插入前言 就喜欢搞这种不需要怎么费劲的东西,只需要把思路阐述清楚,随笔性质的博文,顺手啊,几乎不用改定就可以当博文发布出…

day19|669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树,使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元素的相对结构 (即,如果没有被移除,原有的父代…

生物信息【蛋白序列对比blosum】

参考学习:传统蛋白质序列比对算法 - 知乎 (zhihu.com) 一、蛋白序列同源、相似 同源”(homology)和“相似”(similarity): 同源是指有相同的祖先,在这个意义上,无所谓同源的程度&…