设计模式之中介者模式

中介者模式

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

image.png
电脑主板的功能就类似于一个中介者

经典中介者模式UML

image.png

image.png

例子
image.png

经典的中介者模式

package com.tao.YanMoDesignPattern.Mediator.pattern;/*** @Author Mi_Tao* @Date 2023/7/23* @Description 中介者对象接口* @Version 1.0**/
public interface Mediator {/*** 同事对象在自身改变的时候来通知中介者的方法* 让中介者去负责相应的与其他同事对象的交互* @param colleague 同事对象自身,好让中介者对象通过对象实例去获取同事对象的状态*/public void changed(Colleague colleague);
}
package com.tao.YanMoDesignPattern.Mediator.pattern;/*** @Author Mi_Tao* @Date 2023/7/23* @Description* @Version 1.0**/
public class ConcreteMediator implements Mediator{// 持有并维护同事Aprivate ConreteColleagueA conreteColleagueA;// 持有并维护同事Bprivate ConreteColleagueB conreteColleagueB;public void setConreteColleagueA(ConreteColleagueA conreteColleagueA) {this.conreteColleagueA = conreteColleagueA;}public void setConreteColleagueB(ConreteColleagueB conreteColleagueB) {this.conreteColleagueB = conreteColleagueB;}@Overridepublic void changed(Colleague colleague) {// 某个同事发生了变化,通常需要与其他同事交互// 具体协调相应的同事对象来实现协作行为}
}
package com.tao.YanMoDesignPattern.Mediator.pattern;/*** @Author Mi_Tao* @Date 2023/7/23* @Description 同事类抽象类* @Version 1.0**/
public abstract class Colleague {// 持有中介者对象,每一个同事类都知道它的中介者对象private Mediator mediator;public Colleague(Mediator mediator) {this.mediator = mediator;}public void setMediator(Mediator mediator) {this.mediator = mediator;}public Mediator getMediator() {return mediator;}}
package com.tao.YanMoDesignPattern.Mediator.pattern;/*** @Author Mi_Tao* @Date 2023/7/23* @Description* @Version 1.0**/
public class ConreteColleagueA extends Colleague{public ConreteColleagueA(Mediator mediator) {super(mediator);}/*** 示意方法,执行某些业务功能*/public void someOperation(){// 在需要跟其他同事通信的时候,通知中介者对象getMediator().changed(this);}
}
package com.tao.YanMoDesignPattern.Mediator.pattern;/*** @Author Mi_Tao* @Date 2023/7/23* @Description* @Version 1.0**/
public class ConreteColleagueB extends Colleague{public ConreteColleagueB(Mediator mediator) {super(mediator);}/*** 示意方法,执行某些业务功能*/public void someOperation(){// 在需要跟其他同事通信的时候,通知中介者对象getMediator().changed(this);}
}

例子:电脑主板和各个部件关系

package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;/*** @Author Mi_Tao* @Date 2023/7/23* @Description 中介者对象接口* @Version 1.0**/
public interface Mediator {/*** 同事对象在自身改变的时候来通知中介者的方法* 让中介者去负责相应的与其他同事对象的交互* @param colleague 主板*/public void changed(Colleague colleague);
}

驱动

package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;/*** @Author Mi_Tao* @Date 2023/7/23* @Description 光驱* @Version 1.0**/
public class CDDriver extends Colleague {public CDDriver(Mediator mediator) {super(mediator);}// 光驱读出来数据private String date = "";public String getDate() {return date;}public void readCD(){// 逗号前是视频显示的数据,逗号后是声音this.date ="设计模式,值的好好研究!";// 通知主板,自己的状态发生了改变this.getMediator().changed(this);}
}

CPU

package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;/*** @Author Mi_Tao* @Date 2023/7/23* @Description 光驱* @Version 1.0**/
public class CDDriver extends Colleague {public CDDriver(Mediator mediator) {super(mediator);}// 光驱读出来数据private String date = "";public String getDate() {return date;}public void readCD(){// 逗号前是视频显示的数据,逗号后是声音this.date ="设计模式,值的好好研究!";// 通知主板,自己的状态发生了改变this.getMediator().changed(this);}
}

声卡

package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;/*** @Author Mi_Tao* @Date 2023/7/23* @Description 光驱* @Version 1.0**/
public class SoundCard extends Colleague {public SoundCard(Mediator mediator) {super(mediator);}public void showData(String data){System.out.println("画外音: "+data );}
}

显卡

package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;/*** @Author Mi_Tao* @Date 2023/7/23* @Description 光驱* @Version 1.0**/
public class ViedoCard extends Colleague {public ViedoCard(Mediator mediator) {super(mediator);}public void showData(String data){System.out.println("您正在观看的是: "+data );}
}

中介者类(主板)最核心的,封装其他对象,负责其他对象之间的交互(统筹兼顾)

package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;/*** @Author Mi_Tao* @Date 2023/7/23* @Description* @Version 1.0**/
public class MainBoard implements Mediator{// 需要知道要交互的同事类private CPU cpu = null;private CDDriver cdDriver = null;private SoundCard soundCard = null;private ViedoCard viedoCard = null;@Overridepublic void changed(Colleague colleague) {if (colleague == cdDriver){// 光驱读取数据this.opeCDDriverReadDate((CDDriver)colleague );}if (colleague == cpu){// 表示CPUU 处理完了this.opeCPU((CPU)colleague);}}/*** 处理光驱读取数据以后与其他对象的交互** @param cd cd*/private void opeCDDriverReadDate(CDDriver cd){// 1 先获取光驱读取的数据String date = cd.getDate();// 2 把这些数据传递给CPU 处理this.cpu.executeData(date);}public void opeCPU(CPU cpu){// 1先获取CPU处理后的数据String videoDate = cpu.getVideoDate();String soudDate = cpu.getSoudDate();// 2把这些数据传递给显卡和声卡this.viedoCard.showData(videoDate);this.soundCard.showData(soudDate);}public void setCpu(CPU cpu) {this.cpu = cpu;}public void setCdDriver(CDDriver cdDriver) {this.cdDriver = cdDriver;}public void setSoundCard(SoundCard soundCard) {this.soundCard = soundCard;}public void setViedoCard(ViedoCard viedoCard) {this.viedoCard = viedoCard;}
}

测试

package com.tao.YanMoDesignPattern.Mediator.case1_mainbox;/*** @Author Mi_Tao* @Date 2023/7/23* @Description* @Version 1.0**/
public class Client {public static void main(String[] args) {//  1 创建中介者 -- 主板对象MainBoard mediator = new MainBoard();// 2 创建同事类CDDriver cdDriver = new CDDriver(mediator);CPU cpu = new CPU(mediator);SoundCard soundCard = new SoundCard(mediator);ViedoCard viedoCard = new ViedoCard(mediator);// 3 让中介者知道所有的同事mediator.setCpu(cpu);mediator.setCdDriver(cdDriver);mediator.setSoundCard(soundCard);mediator.setViedoCard(viedoCard);// 4 开始看电影 把光盘放入光驱,光驱开始读盘cdDriver.readCD();}
}

在这里插入图片描述

中介者的本质:封装交互(跟外观者模式有点像)

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

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

相关文章

Excel快捷键F1-F9详解:掌握实用快捷操作,提升工作效率

Excel是广泛应用于办公场景的优质电子表格软件,然而,许多人只是使用鼠标点击菜单和工具栏来完成操作,而忽略了快捷键的威力。在本文中,我们将详解Excel中的F1-F9快捷键,帮助您掌握实用的快捷操作,提升工作效…

leetcode(力扣)剑指 Offer 16. 数值的整数次方 (快速幂)

文章目录 题目描述思路分析完整代码 题目描述 实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。 示例 1: 输入:x 2.00000, n 10 输出:10…

通向架构师的道路之Apache整合Tomcat

一、先从J2EE工程的通用架构说起 这是一个通用的Web即B/S工程的架构,它由: Web Server App Server DB Server 三大部分组成,其中: Web Server 置于企业防火墙外,这个防火墙,大家可以认为是…

c语言(函数)

目录 何为函数 库函数 自定义函数 二分查找数组下标 链式访问 函数的声明 函数定义 递归 正向打印数字 打印字符个数 使用临时变量 递归(不使用临时变量) n的阶乘 一般形式 递归 斐波那契数 递归 正常做法 何为函数 在计算机科学中,子程序是一个…

单片机外部晶振故障后自动切换内部晶振——以STM32为例

单片机外部晶振故障后自动切换内部晶振——以STM32为例 作者日期版本说明Dog Tao2023.08.02V1.0发布初始版本 文章目录 单片机外部晶振故障后自动切换内部晶振——以STM32为例背景外部晶振与内部振荡器STM32F103时钟系统STM32F407时钟系统 代码实现系统时钟设置流程时钟源检测…

spring AOP学习

概念 面向切面编程横向扩展动态代理 相关术语 动态代理 spring在运行期,生成动态代理对象,不需要特殊的编译器 Spring AOP的底层就是通过JDK动态代理或者CGLIb动态代理技术为目标Bean执行横向织入 目标对象实现了接口,spring使用JDK的ja…

Redis 集群 (cluster)

是什么 官网:Redis cluster specification | Redis 由于数据量过大,单个Master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作…

【机器学习】西瓜书习题3.5Python编程实现线性判别分析,并给出西瓜数据集 3.0α上的结果

参考代码 结合自己的理解,添加注释。 代码 导入相关的库 import numpy as np import pandas as pd import matplotlib from matplotlib import pyplot as plt导入数据,进行数据处理和特征工程 得到数据集 D { ( x i , y i ) } i 1 m , y i ∈ { 0 ,…

VR 变电站事故追忆反演——正泰电力携手图扑

VR(Virtual Reality,虚拟现实)技术作为近年来快速发展的一项新技术,具有广泛的应用前景,支持融合人工智能、机器学习、大数据等技术,实现更加智能化、个性化的应用。在电力能源领域,VR 技术在高性能计算机和专有设备支…

【机器学习】处理样本不平衡的问题

文章目录 样本不均衡的概念及影响样本不均衡的解决方法样本层面欠采样 (undersampling)过采样数据增强 损失函数层面模型层面采样集成学习 决策及评估指标 样本不均衡的概念及影响 机器学习中,样本不均衡问题经常遇到,比如在金融…

uniapp运行项目到iOS基座

2022年9月,因收到苹果公司警告,目前开发者已无法在iOS真机设备使用未签名的标准基座,所以现在要运行到 IOS ,也需要进行签名。 Windows系统,HBuilderX 3.6.20以下版本,无法像MacOSX那样对标准基座进行签名…

选读SQL经典实例笔记16_逻辑否定

1. 示例数据 1.1. student insert into student values (1,AARON,20) insert into student values (2,CHUCK,21) insert into student values (3,DOUG,20) insert into student values (4,MAGGIE,19) insert into student values (5,STEVE,22) insert into student values (6…

伯俊ERP和金蝶云星空单据接口对接

伯俊ERP和金蝶云星空单据接口对接 对接源平台:金蝶云星空 金蝶K/3Cloud在总结百万家客户管理最佳实践的基础上,提供了标准的管理模式;通过标准的业务架构:多会计准则、多币别、多地点、多组织、多税制应用框架等,有效支持企业的运…

jenkins gitlab多分支构建发布

内容背景介绍 这个是新手教程,普及概念为主 公司现在还使用单分支发布测试环境和生产,多人协同开发同一个项目导致测试环境占用等待等情况 测试环境占用等待问题 测试环境代码直接合并到 master,容易导致误发布到生产的情况 避免多版本同时发布测试不完善的情况出现 中间件…

以CS32F031为例浅说国产32位MCU的内核处理器

芯片内核又称CPU内核,它是CPU中间的核心芯片,是CPU最重要的组成部分。由单晶硅制成,CPU所有的计算、接受/存储命令、处理数据都由核心执行。各种CPU核心都具有固定的逻辑结构,一级缓存、二级缓存、执行单元、指令级单元和总线接口…

django bootstrap html实现左右布局,带折叠按钮,左侧可折叠隐藏

一、实现的效果 在django项目中,需要使用bootstrap 实现一个左右分布的布局,左侧区域可以折叠隐藏起来,使得右侧的显示区域变大。(为了区分区域,左右加了配色,不好看的修改颜色即可) 点击折叠按钮,左侧区域隐藏,右侧区域铺满: 二、实现思路 1、使用col-md属性,让左…

改进的智能优化算法定性分析:收敛行为分析(Analysis of the convergence behavior )

目录 一、智能优化算法改进收敛行为分析运行结果 二、收敛性分析 三、GWO1在F1收敛性运行结果 四、改进灰狼算法GWO1 五、代码获取 一、智能优化算法改进收敛行为分析运行结果 本文以改进的灰狼算法 GWO1 为例,在 CEC2005 测试函数上进行定性分析实验。 F1:…

【前端知识】React 基础巩固(三十六)——RTK中的异步操作

React 基础巩固(三十六)——RTK中的异步操作 一、RTK中使用异步操作 引入RTK中的createAsyncThunk,在extraReducers中监听执行状态 import { createSlice, createAsyncThunk } from "reduxjs/toolkit"; import axios from "axios";export cons…

代理模式——对象的间接访问

1、简介 1.1、概述 由于某些原因,客户端不想或不能直接访问某个对象,此时可以通过一个被称为“代理”的第三者来实现间接访问,该方案对应的设计模式被称为代理模式。 代理模式是一种应用很广泛的结构型设计模式,而且变化很多。…

Elasticsearch 全文检索 分词检索-Elasticsearch文章四

文章目录 官方文档地址refercence文档全文搜索体系match简单查询match 多词/分词单字段分词match多个词的逻辑控制match的匹配精度match_pharse_prefix分词前缀方式match_bool_prefixmulti_match多字段匹配 query string类型Interval类型DSL查询之Term详解聚合查询之Bucket聚合…