设计模式(十二):中介者模式(行为型模式)

        Mediator,中介者模式:用一个中介对象封装一些列的对象交互。属于行为型模式

        Facade,外观模式:为子系统中的一组接口提供一致的界面,facade
提供了一高层接口,这个接口使得子系统更容易使用。属于结构型模式

        两者其实挺像,但是外观模式更多的是把一系列过程封装在一个外观类,比如下单,支付,增加积分几个服务封装在一个外观类,客户端直接调用这个外观类的一个方法即可,就不用依次去调用了各个服务了,参考设计模式(五):外观模式(结构型模式)

        而中介者模式,中介者负责消息的传递,解耦客户端对象和服务端对象各个接口的交互。

中介者全程参与交易过程,而外观模式外观类只是负责封装各个子系统的接口。不直接参与交易。

        下面举例房地产中介参与房子买卖过程。

        试想,如果没有中介者参与其中,买房者需要挨家挨户去敲门,你们家卖房子不?卖多少钱?很多人是不卖房的,你会吃闭门羹,你(客户端对象)和房东(服务端对象)之间是紧密耦合的,有了中介,他事先帮你把房地产信息收集好了。他可以主动去联系房东,或者房东主动去他们店挂牌。你只需要联系中介就可以了。说出你的需求,中介帮你匹配房源,促成你和房东之间的交易即可。你只需要和中介一个人耦合即可,和房东们之间松耦合。

        类图:

         上代码:

房东:

package com.figo.study2024.pattern.mediator;/*** @ClassName:Landlord* @PackageName:com.figo.study2024.pattern.mediator* @Description:房东基类* @Date:2024/3/21 20:40* @Author:figo*/
public abstract class Landlord {private Mediator mediator;public Landlord(Mediator mediator){this.mediator=mediator;}public Mediator getMediator() {return mediator;}/*** 满足条件,签合同* @return*/public abstract boolean signContract(int price);}package com.figo.study2024.pattern.mediator;/*** @ClassName:SmallHouseLandlord* @PackageName:com.figo.study2024.pattern.mediator* @Description:小房子房东具体类* @Date:2024/3/21 20:44* @Author:figo*/
public class SmallHouseLandlord extends Landlord{public SmallHouseLandlord(Mediator mediator) {super(mediator);//直接往中介处注册mediator.register("smallHouseLandloard1",this);}@Overridepublic boolean signContract(int price) {if(price>=200){System.out.println("大于200万,我家房子出售,来赶紧签合同!");return true;}else {System.out.println("小于200万,我家房子不卖");return false;}}
}package com.figo.study2024.pattern.mediator;/*** @ClassName:BigHouseLandlord* @PackageName:com.figo.study2024.pattern.mediator* @Description:大房子房东具体类* @Date:2024/3/21 20:45* @Author:figo*/
public class BigHouseLandlord extends Landlord{public BigHouseLandlord(Mediator mediator) {super(mediator);//直接往中介处注册mediator.register("bigHouseLandload1",this);}@Overridepublic boolean signContract(int price) {if(price>=500){System.out.println("大于500万,我家房子出售,来赶紧签合同!");return true;}else {System.out.println("小于500万,我家房子不卖");return false;}}
}

            中介:

package com.figo.study2024.pattern.mediator;/*** @ClassName:Mediator* @PackageName:com.figo.study2024.pattern.mediator* @Description:中介者接口* @Date:2024/3/21 20:21* @Author:figo*/
public interface Mediator {void register(String name,Landlord landlord); //注册客户对象,房主在中介登记了信息void unRegister(String name);void sendMessage(int price); //转发客户信息,与客户对象交互信息的方法}package com.figo.study2024.pattern.mediator;import java.util.HashMap;
import java.util.Map;/*** @ClassName:LandlordMediator* @PackageName:com.figo.study2024.pattern.mediator* @Description:房地产中介者* @Date:2024/3/21 20:51* @Author:figo*/
public class LandlordMediator implements Mediator{private Map<String,Landlord> landlordMap;public LandlordMediator(){synchronized (this) {if(landlordMap==null) {landlordMap = new HashMap<>();}}}@Overridepublic void register(String name, Landlord landlord) {landlordMap.put(name,landlord);}@Overridepublic void unRegister(String name) {landlordMap.remove(name);}/*** 将客户出的价格,去轮询各个卖家是否有意向* @param price*/@Overridepublic void sendMessage(int price) {for(Map.Entry<String,Landlord> entry :landlordMap.entrySet()) {boolean isSuccess=landlordMap.get(entry.getKey()).signContract(price);if(isSuccess) {System.out.println(entry.getKey() + "愿意出售房子");}}}
}

客户:

package com.figo.study2024.pattern.mediator;/*** @ClassName:PatternTest* @PackageName:com.figo.study2024.pattern.mediator* @Description:模拟客户端调用中介者模式* @Date:2024/3/21 21:12* @Author:figo*/
public class PatternTest {public static void main(String[] args) {LandlordMediator mediator=new LandlordMediator();//注册过程,可以在其他地方已经完成,不用写在客户端,这里测试需要,简单点写这里了BigHouseLandlord bigHouseLandlord=new BigHouseLandlord(mediator);SmallHouseLandlord smallHouseLandlord=new SmallHouseLandlord(mediator);System.out.println("-------------买家出100w,看看是否有卖家愿意出手---------------");mediator.sendMessage(100);System.out.println("-------------买家出200w,看看是否有卖家愿意出手---------------");mediator.sendMessage(200);System.out.println("-------------买家出500w,看看是否有卖家愿意出手---------------");mediator.sendMessage(500);}
}

运行结果:


-------------买家出100w,看看是否有卖家愿意出手---------------
小于200万,我家房子不卖
小于500万,我家房子不卖
-------------买家出200w,看看是否有卖家愿意出手---------------
大于200万,我家房子出售,来赶紧签合同!
smallHouseLandloard1愿意出售房子
小于500万,我家房子不卖
-------------买家出500w,看看是否有卖家愿意出手---------------
大于200万,我家房子出售,来赶紧签合同!
smallHouseLandloard1愿意出售房子
大于500万,我家房子出售,来赶紧签合同!
bigHouseLandload1愿意出售房子

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

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

相关文章

Linux升级GCC

文章目录 一、安装 EPEL 仓库二、更新yum三、安装 CentOS 开发工具组四、安装scl五、安装gcc 11六、启用gcc 11七、设置永久使用 一、安装 EPEL 仓库 命令&#xff1a; yum install epel-release -y二、更新yum 命令&#xff1a; yum update -y三、安装 CentOS 开发工具组 …

opencv各个模块介绍(2)

Features2D 模块&#xff1a;特征检测和描述子计算模块&#xff0c;包括SIFT、SURF等算法。 Features2D 模块提供了许多用于特征检测和描述子匹配的函数和类&#xff0c;这些函数和类可用于图像特征的提取、匹配和跟踪。 FeatureDetector&#xff1a;特征检测器的基类&#xf…

[BT]BUUCTF刷题第6天(3.24)

第6天 Web [极客大挑战 2019]PHP Payload&#xff1a; O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";s:3:"100";}这道题考点是网站源码备份文件泄露和PHP反序列化&#xff0c;有篇介…

t-rex2开放集目标检测

论文链接&#xff1a;http://arxiv.org/abs/2403.14610v1 项目链接&#xff1a;https://github.com/IDEA-Research/T-Rex 这篇文章的工作是基于t-rex1的工作继续做的&#xff0c;核心亮点&#xff1a; 是支持图片/文本两种模态的prompt进行输入&#xff0c;甚至进一步利用两…

013_Linux(上传rz,下载sz,tar,zip,unzip)

目录 一、上传、下载 1、通过鼠标操作 &#xff08;1&#xff09;下载 &#xff08;2&#xff09;上传 2、通过命令操作 rz、sz &#xff08;1&#xff09;下载 sz &#xff08;2&#xff09;上传 rz 二、压缩、解压 1、tar命令 &#xff08;1&#xff09;压缩 &…

使用amd架构的计算机部署其他架构的虚拟机(如:arm)

1 下载quem模拟器 https://qemu.weilnetz.de/w64/2 QEMU UEFI固件文件下载(引导文件) 推荐使用&#xff1a;https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd3 QEMU 安装 安装完成之后&#xff0c;需要将安装目录添加到环境变…

vscode的一些技巧

技巧1&#xff1a;调试时传参数 在launch.json的configuration中"pwd"或者"program"选项之后添加如下选项&#xff1a; “--args”:["参数1", "参数2", ..., "参数3] 参数之间使用逗号隔开 技巧2&#xff1a;断点 普通断点使…

通过dbeaver链接dm8数据库

一、环境说明 windows 11 vmware 17 ubuntu 22 tt:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammytt:~$ docker info Client:Version: 24.0.5Context: d…

Python 全栈系列236 rabbit_agent搭建

说明 通过rabbit_agent, 以接口方式实现对队列的标准操作&#xff0c;将pika包在微服务内&#xff0c;而不必在太多地方重复的去写。至少在服务端发布消息时&#xff0c;不必再去考虑这些问题。 在分布式任务的情况下&#xff0c;客户端本身会启动一个持续监听队列的客户端服…

Java研学-SpringBoot(二)

二 Spring Boot 介绍 1 简介 Spring Boot是由Pivotal团队提供的全新框架&#xff0c;主要目标是简化Spring应用程序的配置和部署过程&#xff0c;减少开发者在项目搭建和配置上的工作量&#xff0c;让开发者能够更专注于业务逻辑的实现。它使用特定的方式来进行配置&#xff0…

Request请求参数----中文乱码问题

一: GET POST获取请求参数: 在处理为什么会出现中文乱码的情况之前, 首先我们要直到GET 以及 POST两种获取请求参数的不同 1>POST POST获取请求参数是通过输入流getReader来进行获取的, 通过字符输入流来获取响应的请求参数, 并且在解码的时候, 默认的情况是 ISO_885…

基于SpringBoot+Vue+Mybatis的408刷题小程序管理端

简介 原始数据&#xff1a;书目信息、章节信息、题目信息、系统菜单、系统角色、系统用户。 主要任务&#xff1a;系统主要采用spring boot作为后端框架&#xff0c;前端使用vueelementUI&#xff0c;为408刷题小程序提供一个方面的管理和维护的任务&#xff0c;主要功能包括…

图解Kafka架构学习笔记(三)

准备Kafka环境 这里推荐使用Docker Compose快速搭建一套本地开发环境。 以下docker-compose.yml文件用来搭建一套单节点zookeeper和单节点kafka环境&#xff0c;并且在8080端口提供kafka-ui管理界面。 version: 2.1services:zoo1:image: confluentinc/cp-zookeeper:7.3.2hos…

day6:STM32MP157——串口通信实验

使用的是cortex A7内核 【串口通信的工作原理】 本次实验使用的是uart4的串口&#xff0c;分别使用了uart4_tx和uart4_rx两个引脚。根据板子的原理图我们可以知道&#xff0c;他们分别对应着芯片的PG11和PB2 从引脚名字也可以知道使用了GPIO口&#xff0c;所以本次实验同样需…

ubuntu20.04安装 ffmpeg 开发环境

参考&#xff1a;参考1 一些相关软件包&#xff0c;已打包整理好&#xff0c;如下 源码包 1、安装步骤 创建安装目录 sudo mkdir -p /usr/local/ffmpeg/lib 解压源码 tar -jxf ffmpeg-4.3.2.tar.bz2 到指定ffmpeg目录进行配置 cd ffmpeg-4.3.2/ 配置&#xff1a;会报错很多…

Spark Streaming DStream

Spark Streaming DStream DStream 即Discretized Stream&#xff0c;中文叫做离散流&#xff0c;Spark Streaming提供的一种高级抽象&#xff0c;代表了一个持续不断的数据流。 DStream可以通过输入数据源来创建&#xff0c;比如Kafka、Flume&#xff0c;也可以通过对其他DS…

【JAVA】通过JAVA实现用户界面的登录

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法|MySQL| ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-wyCvaz0EBNwHcwsi {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

2025汤家凤考研数学视频,基础网课百度网盘课程+PDF讲义资料

2025汤家凤大神及数学全程 docs.qq.com/doc/DTmtOa0Fzc0V3WElI 复制粘贴到浏览器&#xff0c;可以见所有的Ke 第一轮 夯实基础 1.阅读大纲考查要求&#xff0c;明确每章的学习目标&#xff1b; 2.按节学习数学理论基础知识&#xff0c;吃透书中例题&#xff1b; 3.学习每章…

数学建模综合评价模型与决策方法

评价方法主要分为两类&#xff0c;其主要区别在确定权重的方法上 一类是主观赋权法&#xff0c;多次采取综合资讯评分确定权重&#xff0c;如综合指数法&#xff0c;模糊综合评判法&#xff0c;层次评判法&#xff0c;功效系数法等 另一类是客观赋权法&#xff0c;根据各指标…

ubuntu上一款好用的串口工具screen

看名字&#xff0c;你猜他是什么&#xff1f; 安装 sudo apt install screen 然后将USB串口接到虚拟机&#xff0c;执行dmesg命令查看串口设备名&#xff1a; 测试&#xff1a; sudo screen /dev/ttyUSB0 115200确实很简单。