设计模式之中介者模式

中介者模式

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

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,一经查实,立即删除!

相关文章

Linux用户权限信息、chmod以及chown命令

权限修改 权限信息chmod命令chown命令 权限信息 在Linux系统中,每个文件和目录都包含了权限信息,用于控制对其的访问权限。 文件权限:Linux系统中的文件权限由三组权限表示,分别是所有者权限、组权限和其他用户权限。 所有者权…

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的阶乘 一般形式 递归 斐波那契数 递归 正常做法 何为函数 在计算机科学中,子程序是一个…

150. 逆波兰表达式求值

150. 逆波兰表达式求值 题目-中等难度示例1. 字典存储function2. if-else 题目-中等难度 给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意: 有效的算符为 ‘’、‘-’…

华为数通HCIA-实验环境ensp简介

ensp 路由器:AR系列、NE系列; 模拟器中使用AR2220; 交换机:S系列、CE系列; 模拟器中使用S5700; 线缆:copper——以太网链路; serial——串行链路,在模拟器中用于模…

单片机外部晶振故障后自动切换内部晶振——以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)过采样数据增强 损失函数层面模型层面采样集成学习 决策及评估指标 样本不均衡的概念及影响 机器学习中,样本不均衡问题经常遇到,比如在金融…

JVM垃圾收集机制详解与性能调优(详细)

JVM垃圾收集机制详解与性能调优 概述 Java虚拟机中的垃圾收集主要是针对堆内存进行的,其目的是识别出已死对象,并回收其占用的内存。正确理解和使用垃圾收集机制,对于提升Java程序性能非常重要。 常见的垃圾收集器包括串行收集器、吞吐量收集器和并发收集器。下一节我先介绍…

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,容易导致误发布到生产的情况 避免多版本同时发布测试不完善的情况出现 中间件…

PyTorch 分布式训练和启动脚本torch.distributed.launch torchrun slurm

1、DataParallel 如果当前有4个GPU,batch_size16,那么模型将被复制到每一个GPU上,在前向传播时,每一个gpu将分到4个batch,每个gpu独立计算依据分到的batch计算出结果的梯度,然后将梯度返回到第一个GPU上&a…

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

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