研磨设计模式day10中介者模式

目录

场景

思考

解决思路

模式讲解

调用示意图 

中介者模式的优缺点

中介者模式的本质

何时选用


场景

如果没有主板,电脑各个配件怎么交互呢?

有些配件接口不同,必须把数据接口进行转换才能匹配上,无敌复杂。

有了主板之后就是下面这个样子

思考

软件开发中针对,内部复杂的我们可以找一个中介者,让中介者去处理这些事情。

解决思路

白话解析:

1.分为中介者和同事两个层级。同事们都和我交互,而我知道怎么把同事的交互跟别人的串联起来,但单个同事你不用管我是怎么跟人交互的,你做好自己的就可以了。

2.同事在处理完自己的事情后,你得告诉中介者你做了改变,让我心里有数,不能自己想做什么做什么,闷头干大事不交流。

模式讲解

结构图

代码示例:

Mediator

package day09中介者模式;/*** 中介者对象的接口*/
public interface Mediator {/*** 同事对象在自身改变的时候来通知中介者的方法,* 让中介者去负责相应的与其他同事对象的交互* @param colleague 同事对象自身,好让中介者对象通过对象实例去获取同事对象的状态*/public void changed(Colleague colleague);
}

ConcreteMediator

package day09中介者模式;import day09中介者模式.同事.CDDriver;
import day09中介者模式.同事.CPU;
import day09中介者模式.同事.SoundCard;
import day09中介者模式.同事.VideoCard;/*** 相当于主板,实现中介者对象*/
public class MediatorImpl implements Mediator {/*** 需要知道交互的同时类-光驱类*/private CDDriver cdDriver = null;/*** 需要知道交互的同时类-CPU类*/private CPU cpu = null;/*** 需要知道交互的同时类-显卡类*/private VideoCard videoCard = null;/*** 需要知道交互的同时类-声卡类*/private SoundCard soundCard = null;/*** 方法重写** @param colleague 同事对象自身,好让中介者对象通过对象实例去获取同事对象的状态*/@Overridepublic void changed(Colleague colleague) {if (colleague == cdDriver) {// 表示光驱读取数据了this.opeCDDriverReadData((CDDriver) colleague);} else if (colleague == cpu) {// 表示CPU处理完了this.opeCPU((CPU) colleague);}}/*** 处理光驱读取数据以后与其他对象的交互* @param cd 光驱同事对象*/private void opeCDDriverReadData(CDDriver cd) {//1.先获取光驱读取的数据String data = cd.getData();//2.把这些数据传递给CPU进行处理this.cpu.executeData(data);}/*** 处理CPU处理完数据后与其他对象的交互* @param cpu*/private void opeCPU(CPU cpu) {//1.先获取CPU处理后的数据String videoData = cpu.getVideoData();String soundData = cpu.getSoundData();//2.把这些数据传递给显卡和声卡展示出来this.videoCard.showData(videoData);this.soundCard.soundData(soundData);}public CDDriver getCdDriver() {return cdDriver;}public void setCdDriver(CDDriver cdDriver) {this.cdDriver = cdDriver;}public CPU getCpu() {return cpu;}public void setCpu(CPU cpu) {this.cpu = cpu;}public VideoCard getVideoCard() {return videoCard;}public void setVideoCard(VideoCard videoCard) {this.videoCard = videoCard;}public SoundCard getSoundCard() {return soundCard;}public void setSoundCard(SoundCard soundCard) {this.soundCard = soundCard;}}
Colleague,我这里定义成抽象父类
package day09中介者模式;/*** 所有同事的抽象父类的定义*/
public abstract class Colleague {/*** 持有中介者对象,每一个同事都知道它的中介者对象*/private Mediator mediator;/*** 构造方法,传入中介者对象* @param mediator*/public Colleague(Mediator mediator){this.mediator = mediator;}/*** 获取当前同时类对应的中介者对象* @return*/public Mediator getMediator(){return mediator;}
}

 同事子类 分别为光驱 cpu 显卡 声卡

package day09中介者模式.同事;import day09中介者模式.Colleague;
import day09中介者模式.Mediator;/*** 光驱类*/
public class CDDriver extends Colleague {public CDDriver(Mediator mediator) {super(mediator);}/*** 光驱读取出来的数据*/private String data = "";/*** 获取光驱读取出来的数据*/public String getData(){return this.data;}/*** 读取光盘*/public void readCD(){// 逗号前是视频显示的数据,逗号后是声音this.data = "设计模式,值得好好研究";// 通知主板,自己的状态发生了改变this.getMediator().changed(this);}
}
package day09中介者模式.同事;import day09中介者模式.Colleague;
import day09中介者模式.Mediator;/*** CPU类*/
public class CPU extends Colleague {public CPU(Mediator mediator) {super(mediator);}/*** 分解出来的视频数据*/private String videoData = "";/*** 分解出来的声音数据*/private String soundData = "";/*** 获取分解出来的视频数据*/public String getVideoData() {return videoData;}/*** 获取分解出来的声音数据*/public String getSoundData() {return soundData;}public void executeData(String data) {// 把数据分解开String[] split = data.split(",");this.videoData = split[0];this.soundData = split[1];// 通知主板,CPU的工作完成this.getMediator().changed(this);}
}
package day09中介者模式.同事;import day09中介者模式.Colleague;
import day09中介者模式.Mediator;/*** 显卡类*/
public class VideoCard extends Colleague {public VideoCard(Mediator mediator) {super(mediator);}/*** 显示视频数据* @param data*/public void showData(String data){System.out.println("您正观看的是:" + data);}
}
package day09中介者模式.同事;import day09中介者模式.Colleague;
import day09中介者模式.Mediator;/*** 声卡类*/
public class SoundCard extends Colleague {public SoundCard(Mediator mediator) {super(mediator);}/*** 按照声频数据发出声音* @param data*/public void soundData(String data){System.out.println("画外音:" + data);}
}

Client

package day09中介者模式;import day09中介者模式.同事.CDDriver;
import day09中介者模式.同事.CPU;
import day09中介者模式.同事.SoundCard;
import day09中介者模式.同事.VideoCard;public class Client {public static void main(String[] args) {// 1.创建中介者-主板对象MediatorImpl mediator = new MediatorImpl();// 2.创建同事类CDDriver cdDriver = new CDDriver(mediator);CPU cpu = new CPU(mediator);VideoCard videoCard = new VideoCard(mediator);SoundCard soundCard = new SoundCard(mediator);// 3.让中介者知道所有的同事mediator.setCdDriver(cdDriver);mediator.setCpu(cpu);mediator.setVideoCard(videoCard);mediator.setSoundCard(soundCard);// 4.开始看电影cdDriver.readCD();}
}

 首先有一个中介者接口Mediator,其中有一个changed方法,这个方法代表同事们发生变化后要通知我,然后是MediatorImpl实现定义的接口(相当于主板,并且定义了交互方法,需要注意的是我这个主板肯定要包含cpu,显卡,声卡,驱动等同事的,不然我的信息也没法转交)

实现changed的方法,就是怎么交互,从上到下,如果传过来的是驱动的信息,怎么搞,如果传过来是cpu的信息,怎么搞。怎么判断顺序呢?

 

 我们自己定义的,进这个方法后

 this.getMediator().changed(this); 有这么一句话,就是将自身的改变后的本身告诉中介者。

然后就在进入这个方法

 判断进来的是什么实体?哦,是驱动

调用第一个if执行。

然后就进入这里 executeData

CPU处理完也是要告知中介者,我完成了,剩下的交给你做吧

 就进入了第二个if。

 showData

soundData

 

 客户端使用:

1.先创建中介者

2.增加同事类

3.让中介者知道所有同事  set进去

4.开始执行第一步


调用示意图 

中介者模式的优缺点

中介者模式的本质

封装交互

何时选用

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

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

相关文章

【leetcode 力扣刷题】链表基础知识 基础操作

链表基础知识 基础操作 链表基础操作链表基础知识插入节点删除节点查找节点 707. 设计链表实现:单向链表:实现:双向链表 链表基础操作 链表基础知识 在数据结构的学习过程中,我们知道线性表【一种数据组织、在内存中存储的形式】…

java八股文面试[多线程]——合适的线程数是多少

知识来源: 【并发与线程】 合适的线程数量是多少?CPU 核心数和线程数的关系?_哔哩哔哩_bilibili

03.sqlite3学习——数据类型

目录 sqlite3学习——数据类型 SQL语句的功能 SQL语法 SQL命令 SQL数据类型 数字类型 整型 浮点型 定点型decimal 浮点型 VS decimal 日期类型 字符串类型 CHAR和VARCHAR BLOB和TEXT SQLite 数据类型 SQLite 存储类 SQLite 亲和类型(Affinity)及类型名称 Boo…

如何使用PHP实现多语言网站功能

如何使用PHP实现多语言网站功能 在全球化的今天,开发多语言网站成为了一个必要的需求。PHP作为一种常用的编程语言,可以很方便地实现多语言网站功能。本文将介绍如何使用PHP实现多语言网站功能,并提供相应的代码示例。 一、创建语言文件 首先…

如果将PC电脑变成web服务器:使用python3监测公网IP实现DDNS

如果将PC电脑变成web服务器:使用python3监测公网IP实现DDNS 上一篇文章中,我们使用Nignx的反向代理和端口转发实现域名访问家里主机上的web了。 由于家庭宽带基本都是动态IP,每当你重启一次光猫,IP地址就会变化一次。当光猫因为…

ubuntu修改默认文件权限umask

最近在使用ubuntu的过程中发现一个问题: 环境是AWS EC2,登录用户ubuntu,系统默认的umask是027,修改/etc/profile文件中umask 027为022后,发现从ubuntu用户sudo su过去root用户登录查询到的umask还是027,而…

C++动态库编程 | C++名称改编、标准C接口、extern “C”、函数调用约定以及def文件详解

目录 1、导入导出声明 2、C函数名称改编与extern "C" 3、函数调用约定与跨语言调用 3.1、函数调用约定 3.2、跨语言调用dll库接口 3.3、函数调用约定以哪个为准 4、def文件的使用 5、在C程序中引用ffmpeg库中的头文件链接报错问题 6、最后 VC常用功能开发汇…

基于RUM高效治理网站用户体验入门-价值篇

用户体验 用户体验基本包含访问网站的性能、可用性和正确性。通俗的讲,就是一把通过用户访问测量【设计者】意图的尺子。 本文目的 网站如何传递出设计者的意图,可能收页面加载时间太长、或者页面在用户的浏览器中渲染时间太慢,或者第三方设…

使用Maven父工程构建spring boot子工程

1.父工程删除src目录,pom文件配置parent为spring-boot-starter-parent 2.创建子工程,子工程引入一个springboot相关依赖 注意:子工程引入springboot相关依赖之后子工程才能被解析为springboot模块

单片机学习-蜂鸣器如何发出声音

硬件电路 软件编写 ①发出声音 #include "reg52.h" typedef unsigned int u16; // 重新定义 类型 typedef unsigned char u8; // 重新定义 类型sbit BEEP P2^5; //定义 P2第五个管教 为BEEP // 延时函数 void delay_time(u16 times) {while(times--); } vo…

qt tableview setEditTriggers解析

EditTrigger EditTrigger是QAbstractItemView Class的Public Function This property holds which actions will initiate item editing 此属性保存哪些操作将启动项编辑 This property is a selection of flags defined by EditTrigger, combined using the OR operator. T…

python编程环境使用技巧2-python环境迁移

Python环境迁移步骤 将Python环境从一个计算机迁移到另一个计算机可以按照以下步骤进行: 1-备份环境: 在源计算机上,使用pip工具备份当前Python环境的包列表到一个文本文件。在命令行终端中执行以下命令: pip freeze > requi…

layUI 中 穿梭框无法获取值的细节问题

初始化的时候一定要指定id,不然就会出现无法调用 获得右侧数据和实例重载的方法

C++ Primer 第2章 变量和基本类型

C Primer 第2章 变量和基本类型 2.1 基本内置类型2.1.1 算术类型一、带符号类型和无符号类型练习 2.1.2 类型转换一、含有无符号类型的表达式 2.1.3 字面值常量一、整型和浮点型字面值二、字符和字符串字面值三、转义序列四、指定字面值的类型五、布尔字面值和指针字面值 2.2 变…

网络字节序——TCP接口及其实现简单TCP服务器

网络字节序——TCP接口及其实现简单TCP服务器 文章目录 网络字节序——TCP接口及其实现简单TCP服务器简单TCP服务器的实现1. 单进程版:客户端串行版2. 多进程版:客户端并行版netstat查看网络信息3.多线程版:并行执行log.hpp 守护进程fg、bg s…

Vue的使用

Vue的使用 Vue到底是啥?Vue中包含了两部分虚拟DOM 模块化编程虚拟DOM,在我们重用模板的时候,在Vue中存在虚拟DOM 虚拟DOM是为了更好的去重用我们的DOM (增加元素的时候,先去虚拟DOM找是否存在,如果有那么不用生成&am…

android系统启动流程之init启动分析

先根据上图来描述下安卓整个系统的启动流程: 当上电时,系统先执行BootRom, 加载引导程序执行。 然后进入bootloader,在安卓系统中基本上这个bootloader是uboot, 通过uboot引导启动内核,此时运行在kernel空间,这时的i…

【Go 基础篇】Go语言中的自定义错误处理

错误是程序开发过程中不可避免的一部分,而Go语言以其简洁和高效的特性闻名。在Go中,自定义错误(Custom Errors)是一种强大的方式,可以为特定应用场景创建清晰的错误类型,以便更好地处理和调试问题。本文将详…

基于Googlenet深度学习网络的交通工具种类识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ....................................................................................% 获…

SpringCloud之断路器聚合监控

一、Hystrix Turbine简介 看单个的Hystrix Dashboard的数据并没有什么多大的价值,要想看这个系统的Hystrix Dashboard数据就需要用到Hystrix Turbine。Hystrix Turbine将每个服务Hystrix Dashboard数据进行了整合。Hystrix Turbine的使用非常简单,只需要…