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

news2024/11/15 5:12:03

目录

场景

思考

解决思路

模式讲解

调用示意图 

中介者模式的优缺点

中介者模式的本质

何时选用


场景

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

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

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

思考

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

解决思路

白话解析:

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 同事对象自身,好让中介者对象通过对象实例去获取同事对象的状态
     */
    @Override
    public 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.coloradmin.cn/o/930136.html

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

相关文章

人工智能技术的主要类别

人工智能技术主要类别: 机器学习: 监督学习:使用带有标签的训练数据来训练模型,使其能够预测未知数据的标签。常见任务包括分类和回归。无监督学习:使用无标签的训练数据,模型通过发现数据中的模式、聚类或…

在idea上使用git的reset操作后,出现的四个选项Soft、Mixed、Hard、Keep选择说明

出现场景 选择已经commit的版本,点击Reset Current Branch to Here 然后便会出现下述四个选项 下面便对这个四个选项进行总结说明 原理 git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的 Soft Soft选项:在选择的回退点之后的所有更改将会保留并被gi…

预测下一波物联网网络安全挑战

本文讨论从孤立的物联网设置过渡到互连环境的复杂性,不断扩大的攻击面以及这种演变带来的微妙复杂性。 深入探讨标准化的紧迫性、级联故障的威胁以及利益相关者之间模糊的责任界限。 鉴于从孤立的物联网设备到互连的物联网环境的转变,这给网络安全带来…

研磨设计模式day12迭代器模式

目录 场景 解决方案 解决思路 代码示例 代码改造 Java实现迭代器 迭代器模式的优点 思考 何时选用 场景 大公司收购了一个小公司,大公司的工资系统采用List来记录工资列表,而小公司是采用数组,老板希望通过决策辅助系统来统一查看…

Axure RP

Axure RP 简介下载安装汉化注册 简介 Axure RP(Rapid Prototyping)是一款交互式原型设计工具,用于创建高保真的交互式界面原型和线框图。它主要用于用户体验(UX)和用户界面(UI)设计&#xff0c…

4.RabbitMQ高级特性 幂等 可靠消息 等等

一、如何保证生产者生产消息100%的投递成功 保障消息的成功发出保障MQ节点的成功接收发送端收到MQ节点(Broker)确认应答完善的消息进行补偿机制 1. 理解Confirm确认消息机制 消息的确认,是指生产者投递消息后,如果Broker收到消…

【C语言进阶(7)】内存函数 —— 使用方法 + 模拟实现

文章目录 前言Ⅰ 内存函数⒈memcpy⒉memmove⒊memcmp⒋memset Ⅱ 模拟实现⒈模拟实现 memcpy⒉模拟实现 memmove⒊模拟实现 memcmp⒋模拟实现 memset 前言 内存操作函数的优势 字符串函数只能操作字符串的内容,局限性很大。而内存函数可以操作任意类型的数据&…

Kali 安装浩劫(Havoc Command and Control Framework)

拉取 github 上的项目到本地进入 Havoc 目录 git clone https://github.com/HavocFramework/Havoc.git cd Havoc下载基于 Kali 的一系列软件 sudo apt install -y git build-essential apt-utils cmake libfontconfig1 libglu1-mesa-dev libgtest-dev libspdlog-dev libboost…

改进YOLO系列:7.添加CA注意力机制

添加CA注意力机制 1. CA注意力机制论文2. CA注意力机制原理3. CA注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. CA注意力机制论文 论文题目:Coordinate Attention for Efficient Mobile Network Design 论文链接:Coordinate Attention for Effi…

400电话系统的数据分析和优化对企业的发展和增长有什么具体的好处?

对企业而言,通过400电话系统的数据分析和优化可以带来以下具体好处,促进企业的发展和增长: 优化客户满意度:通过数据分析和优化,企业可以更好地了解客户的需求和偏好,针对性地提供个性化的服务。这将提升客…

如何评估分类模型的好坏

如何评估分类模型的好坏 评估分类预测模型的质量,常用一个矩阵、三条曲线和六个指标。 一个矩阵:混淆矩阵;三条曲线:ROC曲线、PR曲线、KS曲线;六个指标:正确率Acc、查全率R、查准率P、F值、AUC、BEP值、KS…

「快学Docker」Docker容器安全性探析

「快学Docker」Docker容器安全性探析 引言容器安全性威胁Docker容器安全性目录容器镜像安全性主机与容器隔离访问控制运行时监控与防御网络安全性Docker容器安全性最佳实践 总结 引言 在当今快速发展的软件开发和部署领域,容器化技术已经成为一种不可或缺的工具。然…

Zotero文件同步方案:Zotero + Koofr + GooleDrive/OneDrive

Zotero文件同步方案:Zotero Koofr GooleDrive/OneDrive 背景知识ZoteroKoofrGoogleDrive/OneDrive配置步骤注意事项参考资料 觉得文章有收获,欢迎关注公众号鼓励一下作者呀~ 在学习的过程中,也搜集了一些量化、技术的视频及书籍资源&#x…

【业务功能篇83】微服务SpringCloud-ElasticSearch-Kibanan-docke安装-应用层实战

五、ElasticSearch应用 1.ES 的Java API两种方式 Elasticsearch 的API 分为 REST Client API(http请求形式)以及 transportClient API两种。相比来说transportClient API效率更高,transportClient 是通过Elasticsearch内部RPC的形式进行请求…

Win11安装VMware中的镜像的下载

首先,下载好VMware之后需要许可证,在VMware选择许可证填上即可(可以解决一部分VMware创建虚拟机过程中出现的问题)。 百度网盘自取: 链接:https://pan.baidu.com/s/17gBySqoPi2HeGJJlalp-VQ 提取码&…

学信息系统项目管理师第4版系列01_导读

2023年对于信息系统项目管理师(以下简称“高项”)的考生来说真是命运多舛的一年,上半年改大纲换教材,下半年改机考换考法,真是一言难尽啊。 不过,“天要下雨,娘要嫁人”,该考试拿证…

Linux:Nginx服务与搭建

目录 一、Nginx概述 二、Nginx三大作用:反向代理、负载均衡、动静分离 三、Nginx和Apache 3.1Nginx和Apache的差异 3.2Nginx和Apache的优缺点比较 四、编译安装niginx 五、创建Nginx 自启动文件 六、Nginx的信号使用 6.1信号 七、升级 nginx1.18 nginx1.2…

java 里面 long 转换int内存分析

了解补码知识点 要将补码转换为十进制,需要确定补码的符号位。如果补码的符号位为1,则表示为负数,否则表示为正数。 假设我们有一个补码为1 0110 1011 1100 1101 1000 0011 1101 1100 0010 1101 1111 1101 1100 0001 1100 0011 0100 首先&a…

无涯教程-进程 - 组会话控制

在本章中,我们将熟悉进程组,会话和作业控制。 进程组(Process Groups ) - 进程组是一个或多个进程的集合,一个进程组由一个或多个共享相同进程组标识符(PGID)的进程组成。 会话(Sessions) - 它是各种进程组的集合。…

软考A计划-系统集成项目管理工程师-项目风险管理-下

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…