小侃设计模式(十七)-中介者模式

news2024/12/23 9:28:32

1.概述

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性,这种模式提供了一个中介类,来封装一组对象之间的交互,它将对象之间的交互委派给中介对象交互,避免了对象之间的直接交互。中介者又叫调停模式,是迪米特法则的典型代表。本文将详述中介者模式的原理及使用,帮助大家更好地理解。

2.原理及使用

2.1 原理

中介者的UML类图如下所示:
在这里插入图片描述
中介者包含的核心角色有四个:Mediator(抽象中介者)、ConcreteMediator(具体中介者)、Colleague(抽象同事角色)、ConcreteColleague(具有同事角色),具体角色职能如下:

Mediator(抽象中介者):用来定义参与者与中介者之间的交互方式;
ConcreteMediator(具体中介者):实现抽象中介者接口,实现具体交互方式;
Colleague(抽象同事角色):抽象类或者接口,定义参与者如何进行交互;
ConcreteColleague(具有同事角色):实现Colleague中的方法,定义具体行为。

2.2 案例

举一个中介买房的例子把,比较贴切。中介小王专门负责帮助顾客买卖房子,如果没有中介小王,准备卖房的小张和小李就要自己去发广告、联系买房的人,同样,卖房的王大妈也要自己去打广告,联系买房。小王在这里就相当于中介者,来接受卖方和买方的信息,推荐促成买卖。案例类图如下:
在这里插入图片描述
代码如下:

public interface Colleague {

    void sale();

    void buy();

}

public class HouseBuyer implements Colleague {

    private String name;

    private Double price;

    private Double size;

    public HouseBuyer(String name, Double price, Double size) {
        this.name = name;
        this.price = price;
        this.size = size;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Double getSize() {
        return size;
    }

    public void setSize(Double size) {
        this.size = size;
    }

    @Override
    public void sale() {

    }

    @Override
    public void buy() {
        System.out.println(name + "需要的房子大小为:" + size + ",价格为:" + price);
        System.out.println(name + "寻找中介。。。");
    }

}

public class HouseSale implements Colleague {

    private String name;

    private Double price;

    private Double size;

    public HouseSale(String name, Double price, Double size) {
        this.name = name;
        this.price = price;
        this.size = size;

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public Double getSize() {
        return size;
    }

    public void setSize(Double size) {
        this.size = size;
    }

    @Override
    public void sale() {
        System.out.println(name + "卖的房子大小为:" + size + ",价格为:" + price);
    }

    @Override
    public void buy() {

    }
}

public interface Mediator {

    void deal();
}


public class WangMediator implements Mediator {

    private String name;

    private Colleague saler;

    private Colleague buyer;

    public WangMediator(String name, Colleague saler, Colleague buyer) {
        this.name = name;
        this.saler = saler;
        this.buyer = buyer;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Colleague getSaler() {
        return saler;
    }

    public void setSaler(Colleague saler) {
        this.saler = saler;
    }

    public Colleague getBuyer() {
        return buyer;
    }

    public void setBuyer(Colleague buyer) {
        this.buyer = buyer;
    }

    @Override
    public void deal() {
        saler.sale();
        System.out.println(name + "去寻找买方");
        buyer.buy();
        System.out.println(name + "找到买方并成交");
    }
}

测试代码:
public class Client {

    public static void main(String[] args) {
        //买方小王要买房
        HouseBuyer houseBuyer = new HouseBuyer("小张", 150.0, 90.0);
        //卖方王大妈要卖房
        HouseSale houseSale = new HouseSale("王大妈", 160.0, 90.0);
        //他们都找中介者小王
        WangMediator wangMediator = new WangMediator("小王", houseSale, houseBuyer);
        //小王根据需求匹配
        wangMediator.deal();

    }
}

运行结果如下:
在这里插入图片描述
上述案例中,卖方和买方可能有多个,应该是个列表形式,中介者会根据需求去匹配合适的卖方与买方。

2.3 中介者的优点和缺点

2.3.1 优点

1.中介者降低了类之间的耦合程度,所有关联者只与中介者有关系,符合迪米特法则;
2.中介者将对象之间的网状关系变为星型关系,降低了耦合度。

2.3.2 缺点

1.中介者承担了较多的职责,如果中介者出现问题,可能会导致整个系统奔溃;
2.如果设计不当,会导致中介者本身过于复杂;

3.小结

1.中介者模式是一种降低类之间耦合的方式,在日常开发的使用相对较少;
2.中介者的设计思想本质就是降低耦合。

4.参考文献

1.《设计模式之禅》-秦小波著
2.《大话设计模式》-程杰著
3.https://www.bilibili.com/video/BV1G4411c7N4-尚硅谷设计模式
4.https://juejin.cn/post/6986798871858905118

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

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

相关文章

Vue2基础总结

知识点学了太多还是需要总结复习,否则后面会因为零碎的知识点而感到繁杂,那么今天我来总结一下vue相关的知识点,新学习vue的朋友也可以把这当做一个细致总结: 1.Vue是什么(重点): 对于Vue的总…

创建 Vue3.0 工程

1.使用 vue-cli 创建 官方文档 : https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-create // 查看vue/cli版本,确保vue/cli版本在4.5.以上 vue --version vue -V// 安装或者升级你的vue/cli、 覆盖安装最新版本; npm install -g vue/cli//1.创建…

C++初阶 stack和queue的模拟实现

作者:小萌新 专栏:C初阶 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:模拟实现STL库中的stack和queue 考试周结束咯 狠狠的学! stack和queue的模拟实现容器适配器Stack模拟实现接口函数一览代码…

艾美捷西妥昔单抗Cetuximab化学性质和文献参考

西妥昔单抗(抗EGFR)是表皮生长因子受体(EGFR)的抑制剂。 艾美捷西妥昔单抗Cetuximab 品名:西妥昔单抗,抑制剂 完整名称:西妥昔单抗(抗EGFR) 同义词名称:C2…

2022年电动车与车辆工程国际会议(CEVVE 2022)

2022年电动车与车辆工程国际会议(CEVVE 2022) 重要信息 会议网址:www.cevve.org 会议时间:2022年12月19-21日 召开地点:中国北海 截稿时间:2022年12月15日 录用通知:投稿后2周内 收录检索…

CPU、内存占用率高排查

CPU高占用 排查思路 top 命令查看CPU占用率高的进程top -H -p ${pid} 命令查看具体是进程的哪个线程占用CPUprintf ‘%x\n’ ${pid} 将线程的pid转为16进制jstack ${十六进制pid} | grep -A 20 查看线程的基本信息与方法调用栈 模拟排查 [rootVM-24-5-centos www]# top top…

vue可视化管理工具创建项目报错解决errno: -4058;连接超时

vue可视化管理工具创建项目报错解决errno: -4058 简介:vue创建项目时,errno:-4058问题解决,使用vue ui指令时会报连接超时问题解决。 基础材料: 使用的node.js版本:18.12.1 vue版本:4.5.15…

【shell脚本】监控磁盘/内存使用率·检测域名是否正常·一键部署LMNP·拉黑攻击服务器的异常ip

文章目录1、监控2台服务器硬盘利用率脚本实战2、批量检查 5个网站域名是否正常3、统计磁盘使用率,磁盘大于%5 就打印mail 小于 硬盘正常 内存也是一样4、有人攻击我服务器 就拉黑异常ip5、使用for循环安装 批量安装3台服务器 php环境 使用(LAMP&#xff…

Web前端开发技术课程大作业:简单的网页制作期末作业——狐妖小红娘(6页)

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

PM说 | 如何精准的获取用户需求?需求分析到底分析什么?

如何精准获取用户需求?怎么做好需求分析? 文章目录如何精准获取用户需求?怎么做好需求分析?前言一、用户的正在需求是什么二、如何精准的获取用户需求三、实操项目分析四、需求分析的方法总结前言 不知你是否曾遇到这样的处境,听到需求&am…

多线程~实现多线程

实现多线程 进程:是正在运行的程序 是系统进行资源分配和调用的独立单位每一个进程都有它自己的内存空间和系统资源 线程:是进程中的单个顺序控制流,是一条执行路径 单线程:一个进程如果只有一条执行路径,则称为单…

小游戏开发指南及过程中的难点问题

如果仅仅针对个人开发者来讲,要独立开发一款大型游戏几乎无可能,更大成功的可能还是开发一款类似《羊了个羊》这样洗脑的小程序游戏。 所以这里主要论述小游戏开发的情况,也就是小程序游戏,首先从小游戏的开发流程来看&#xff1…

chatGPT:12.12 之后更新的 chatGPT 的本地部署和接口调用,解决 response 403 (无法连接openai服务器)问题

文章目录问题源代码改动Session token 的获取cf_clearance 的获取user-agent 的获取将 config.json.sample 内容修改并移动位置附注:环境配置python > 3.7特别提示playwright & cf_clearancerevChatGPT 版本httpxOpenAIAuth删除 import 中的错误后记问题 因…

web网页设计期末课程大作业:基于HTML+CSS+JavaScript个人书画作品展示HTML模板(6页)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Matlab论文插图绘制模板第69期—带误差棒的折线图(Errorbar)

在之前的文章中,分享了一系列Matlab折线图的绘制模板: 这一次,再来分享一种特殊的折线图:带误差棒的折线图。 先来看一下成品效果: 特别提示:Matlab论文插图绘制模板系列,旨在降低大家使用Matl…

C语言判断一个整数是不是素数(质数)、求100以内的所有素数、求前50个素数

目录 一.什么是素数(质数 Prime) 二.判断一个整数是不是素数(质数)代码 三.求100以内的所有素数(质数) 四.输出前50个素数(质数) 一.什么是素数(质数 Prime&#xff0…

5、metasploit信息搜集

一、概念 针对目标在开放端口、以及运行的服务进行探测。portscan端口扫描mysql安全测试服务版本确定密码嗅探SNMP探测二、metasploit中信息搜集模块 2.1、use auxiliary/gather/ 与 use auxiliary/scanner/ 2.2、针对SMB版本探测(默认445端口) 也可以探…

vTESTstudio入门到精通 - CANoe工程导入vTESTstudio_02

前面我们已经讲完了如何配置出来一个vTESTstudio工程,并且编译成一个可执行的文件,接下来我们就是要把这块可执行文件导入到CANoe中,通过CANoe工程来执行我们编译的脚本,实现对应功能的测试,今天就是给大家分享如何导入。 二、CANoe工程导入vTESTstudio执行文件 1、创建一…

猿如意中的【blender】工具详情介绍

文章目录一、工具名称二、下载安装渠道2.1 什么是猿如意?2.2 如何下载猿如意?三、工具介绍四、blender介绍4.1 blender简介4.2 背景4.3 主要功能五、软件安装过程5.1 如何在猿如意中下载开发工具blender?5.2 下载blender软件截图5.3 blender安…

基于51单片机的数字电压表设计

程序运行图&#xff1a; 仿真原理图&#xff1a; 部分程序&#xff1a; #define LED_GLOBAL 1 #include "led.h" void ledDelay(uint ms) { uchar delayi; while(--ms) { for(delayi0;delayi<124;delayi); } } void init_led(void) { LEDsegLedCode[0]; L…