设计模式之中介者模式

中介者模式

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

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{

    // 持有并维护同事A
    private ConreteColleagueA conreteColleagueA;
    // 持有并维护同事B
    private ConreteColleagueB conreteColleagueB;

    public void setConreteColleagueA(ConreteColleagueA conreteColleagueA) {
        this.conreteColleagueA = conreteColleagueA;
    }

    public void setConreteColleagueB(ConreteColleagueB conreteColleagueB) {
        this.conreteColleagueB = conreteColleagueB;
    }

    @Override
    public 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;
    @Override
    public 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();
    }
}

在这里插入图片描述

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

485modbus转profinet网关连三菱变频器modbus通讯触摸屏监控

本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式,使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关,用户可以有效地管理和监控设备,从…

2023网络安全学习路线 非常详细 推荐学习

首先咱们聊聊,学习网络安全方向通常会有哪些问题 1、打基础时间太长 学基础花费很长时间,光语言都有几门,有些人会倒在学习 linux 系统及命令的路上,更多的人会倒在学习语言上; 2、知识点掌握程度不清楚 对于网络安…

zabbix

ZABBIX 安装 Zabbix z-sever yum list | grep nginx # 查看 nginx 版本 ,这里使用 1.20 nginx.x86_64 1:1.20.1-10.el7 epel yum install -y nginx# 安装 php https://webtatic.com/packages/php72/ # 源的官…

爬虫007_python中的输出以及格式化输出_以及输入---python工作笔记025

首先看输出 输出这里,注意不能直接上面这样,18需要转换成字符串 可以看到python中这个字符串和数字一起的时候,数字要转换一下成字符串. 然后这里要注意%s 和%d,这个s指的是字符串,d指的是数字 注意后面的内容前面要放个% ,然后多个参数的话,那么这里用(),里面用,号隔开 然…

面向对象程序三大特性一:多态(超详细)

目录 1.重写 1.1基本语法规则 1.2规则深化 1.3重写与重载的区别 2.向上转型 2.1简单介绍 2.3向上转型的作用 3.向下转型 3.1介绍 3.2instanceof 基本介绍 4.多态 4.1多态实现条件 4.2避免在构造方法中调用重写的方法 1.重写 重写 (override) :也称为覆…

iOS——Block签名

首先来看block结构体对象Block_layout(等同于clang编译出来的__Block_byref_a_0) #define BLOCK_DESCRIPTOR_1 1 struct Block_descriptor_1 {uintptr_t reserved;uintptr_t size; };#define BLOCK_DESCRIPTOR_2 1 struct Block_descriptor_2 {// requi…

华为数通HCIP-IP组播基础

点到点业务:比如FTP,WEB业务,此类业务主要特点是不同的用户有不同的需求,比如用户A需要下载资料A,用户B需要下载资料B。此类业务一般由单播承载,服务器对于不同用户发送不同的点到点数据流。 ospf、isis…

设计模式行为型——责任链模式

目录 什么是责任链模式 责任链模式的实现 责任链模式角色 责任链模式类图 责任链模式举例 责任链模式代码实现 责任链模式的特点 优点 缺点 使用场景 注意事项 实际应用 什么是责任链模式 责任链模式(Chain of Responsibility Pattern)又叫职…

SpringBoot整合邮件服务

SpringBoot整合邮件服务 发送邮件应该是网站的必备功能之一,什么注册验证,忘记密码或者是给用户发送营销信息。最早期的时候我们会 使用 JavaMail 相关 api 来写发送邮件的相关代码,后来 Spring 推出了 JavaMailSender 更加简化了邮件发送的…

前端下载文化部几种方法(excel,zip,html,markdown、图片等等)和导出 zip 压缩包

文章目录 1、location.href2、location.href3、a标签4、请求后端的方式5、文件下载的方式6、Blob和Base647、下载附件方法(excel,zip,html,markdown)8、封装下载函数9、导出 zip 压缩包相关方法(流方式) 总结 1、location.href //get请求 window.location.href url;2、locati…

电脑更新win10黑屏解决方法

电脑更新win10黑屏解决方法 电脑黑屏出现原因解决步骤 彻底解决 电脑黑屏 出现原因 系统未更新成功就关机,导致系统出故障无法关机 解决步骤 首先长安电源键10s关机 按电源键开机,出现logo时按F8进入安全模式。 进入自动修复环境后,单击…

freeswitch的mod_xml_curl模块

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 随着fs服务的增多,每一台fs都需要在后台单独配置,耗时耗力,心力憔悴。 如果有一个集中管理配置的配置中心,统一管理所有fs的配置,并可以实现动态的修改配置就…

Linux磁盘管理

磁盘管理 基本分区管理 磁盘划分思路 进入分区表,新建分区更新分区表格式化分区表挂载使用 #lsblk #df -h 查看设备挂载情况 #fdisk -l 设备分区情况 #fdisk /dev/sdb 添加一块硬盘,需要将其分两个分区,分别格式化成ext4和vfat格式文件系…

Linux中提示No such file or directory解决方法

说明: 在linux下,./xxx.sh执行shell脚本时会提示No such file or directory。但shell明明存在,为什么就是会提示这个呢? 这种其实是因为编码方式不对,如你在win下编辑sh,然后直接复制到linux下面 实现&…

GPU版PyTorch对应安装教程

一、正确安装符合自己电脑的对应GPU版本的PyTorch之前需要了解三个基本概念 算力、CUDA driver version、CUDA runtime version ①算力:需要先知道你的显卡,之后根据官网表格进行对应,得到算力 ②CUDA driver version:电脑上显卡…

[C++]01.基础,数据类型,运算符

01.基础,数据类型,运算符 一.C基础入门1.HelloWorld2.注释3.变量4.常量5.关键字6.命名规则 二.数据类型1.整形2.sizeof关键字3.浮点型4.字符型5.转义字符6.字符串型7.布尔类型8.数据的输入 三.运算符1.算数运算符2.赋值运算符3.比较运算符4.逻辑运算符 一.C基础入门 1.HelloWo…

Java版Spring Cloud+Spring Boot+Mybatis+uniapp知识付费平台讲解+免费搭建 qt

Java版知识付费源码 Spring CloudSpring BootMybatisuniapp前后端分离实现知识付费平台 提供职业教育、企业培训、知识付费系统搭建服务。系统功能包含:录播课、直播课、题库、营销、公司组织架构、员工入职培训等。 提供私有化部署,免费售…

LBP特征笔记

LBP,局部二值模式(Local Binary Pattern),是一种描述图像局部纹理特征的方式,具有旋转不变性和灰度不变性。首先由T. Ojala, M.Pietikinen, 和 D. Harwood 在1994年提出。 LBP特征描述 基础LBP算子 基础的LBP算子定义…

【Axure教程】移动端二级滑动选择器

今天教大家制作移动端二级滑动选择器的原型模板,该原型已全国一二级省市选择器为案例,因为该原型用中继器做的,所以制作完成之后使用也很方便,只需修改中继器表格里的内容即可 一、效果展示 1. 拖动选择 2. 快捷选择 【原型预览…

s7200Smart

一、介绍 二、通讯 rs485 modbus通讯口