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

        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.mzph.cn/news/761693.shtml

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

相关文章

灵境矩阵平台x百度---智能体(一)

什么是数据插件 大模型插件:大语言模型插件是随着大语言模型发展而诞生的全新插件。大语言模型插件的核心是Web API独立于大语言模型&#xff0c;插件开发过程不受大语言模型的约束&#xff0c;同时没有开发语言的限制&#xff0c;更加通用&#xff0c;只要WebAPI遵循RESTfuI相…

html5cssjs代码 034 自定义字体

html5&css&js代码 034 自定义字体 一、代码二、解释 这是一个带有自定义字体的网页&#xff0c;设置了页面背景颜色、文字颜色以及全局样式。它定义了三种自定义字体并通过font-face规则引入外部字体文件&#xff0c;并通过CSS类&#xff08;.f1, .f2, .f3&#xff09;…

Oracle AI Vector Search 支持使用 SQL 生成向量和计算向量相似度

Oracle AI Vector Search 支持使用 SQL 生成向量和计算向量相似度 0. 事情准备1. 使用 SQL 生成向量数据2. 使用 SQL 计算欧氏距离(Euclidean distance)3. 使用 SQL 计算余弦相似度(Cosine similarity)4. 使用 SQL 计算点积相似度 (Dot Product Similarity)5. 使用 SQL 计算曼哈…

第十二届蓝桥杯省赛CC++ 研究生组-路径

记录到每个结点的最短距离&#xff0c;以此为基础计算后续结点最优值 #include<iostream> #include<algorithm> using namespace std; typedef long long ll;ll gcd(int a, int b){if(!b) return a;return gcd(b, a % b); }int main(){ll dp[2022] {0};//dp[i]记…

如何打破SAST代码审计工具的局限性?

关键词&#xff1a;白盒测试&#xff1b;代码分析工具&#xff1b;代码扫描工具&#xff1b;静态代码检测工具&#xff1b; 在代码的世界里&#xff0c;安全问题如同潜伏的暗礁&#xff0c;随时可能让航行中的软件项目触礁沉没。SAST代码审计工具如同雷达一样&#xff0c;以其独…

inputStream.avaliable()方法网络操作读取不全BUG

一、问题描述 公司有个需求&#xff0c;就是调用方&#xff08;我&#xff09;需要把pdf文件转为Base64字符串作为参数传递为被调用方&#xff0c;以下是大致转换过程&#xff1a; URL url new URL("http://xxxx.pdf");HttpURLConnection uc (HttpURLConnection) …

docker入门(十)—— docker-compose详解

Docker Compose dockercompose官网&#xff1a;https://docs.docker.com/compose/ 什么是 docker compose Docker Compose 是用于定义和运行多容器应用程序的工具。 这是解锁简化和高效的开发和部署体验的关键。 Compose 简化了对整个应用程序堆栈的控制&#xff0c;让您能…

html js css如何使循环混播放视频时视频切换很平滑的过渡

1.html代码 <video id"video1" autoplay loop muted playsinline><source src"video1.mp4" type"video/mp4"> </video> <video id"video2" autoplay loop muted playsinline><source src"video2.mp4…

Chrome 114 带着侧边栏扩展来了

效果展示 manifest.json {"manifest_version": 3,"name": "ChatGPT学习","version": "0.0.2","description": "ChatGPT,GPT-4,Claude3,Midjourney,Stable Diffusion,AI,人工智能,AI","icons"…

全量知识系统 控制器-神经网络设计(设想及百度AI回复)

---备忘&#xff1a;权值、阈值和极值 在神经元的计算中&#xff0c;包括三种计算值&#xff1a;权值、阈值和极值。分别是为全量知识系统设计的三级神经网络中神经元不同层级的计算任务。其中权值 是全连接的性质&#xff0c;阈值是池化的性质&#xff0c;极值是卷积的性质。…

cocos 3.8开发 微信小游戏分包技巧压缩主包

Creator 版本&#xff1a; 3.8.2 目标平台&#xff1a;小游戏开发 压缩后 我不知道别人压缩几百kb是怎么做到的。不过哪个要钱。 我这个技巧不用花钱。 论坛有教程但是没有教详细怎么做。 开整&#xff01; 做一个空白的场景。然后写一个load脚本。load主场景。 从代码可…

数据结构知识总结

二叉树 满二叉树 特性 所有叶子结点都集中在二叉树的最下面一层上&#xff0c;而且结点总数为&#xff1a;2^n-1 (n为层数 / 高度&#xff09; 完全二叉树 特性 若设二叉树的高度为h&#xff0c;除第h层外&#xff0c;其他各层的节点数都达到最大个数&#xff0c;第h层有…

Http中Host,Referer,Origin和Access-Control-Allow-Origin

Http中Host&#xff0c;Referer&#xff0c;Origin和Access-Control-Allow-Origin 文章目录 Http中Host&#xff0c;Referer&#xff0c;Origin和Access-Control-Allow-OriginHost定义特性作用 Referer定义特性作用 Origin定义特性作用 Access-Control-Allow-Origin定义特性作用…

阐述Dubbo协议

1 Dubbo协议概述 Dubbo协议是建立在TCP&#xff08;传输层协议&#xff09;之上的一种应用程序协议。它参考了TCP协议栈中的协议&#xff0c;协议内容由header和body两部分组成。 2 协议头header的组成 协议头组成如下所示。 header格式bit序号0-78-1516-2324-3132-9596-127内…

C语言——指针练习:输出最大值与最小值

题目描述&#xff1a; 输出十个整数中的最大值与最小值。 输入&#xff1a; 十个整数。 输出&#xff1a; 最大值与最小值。 代码如下&#xff1a; #include<stdio.h>int main() {int a[10], i, max, min, *p;p a;for (i 0; i < 10; i)scanf("%d", p…

基于微信小程序的CMS内容管理系统开发笔记

背景调研 内容管理CMS小程序的帮助运营者创建和管理小程序内容&#xff0c;提供一个直观的操作界面&#xff0c;能够轻松地添加、编辑和发布内容&#xff0c;而无需了解复杂的编程知识。可以进行栏目管理&#xff0c;文章管理&#xff0c;编辑文章内容&#xff0c;包括文字、图…

React腳手架已經創建好了,想使用Vite作為開發依賴

使用Vite作為開發依賴 安裝VITE配置VITE配置文件簡單的VITE配置項更改package.json中的scripts在根目錄中添加index.html現在可以瀏覽你的頁面了 安裝VITE 首先&#xff0c;在現有的React項目中安裝VITE npm install vite --save-dev || yarn add vite --dev配置VITE配置文件 …

蓝桥杯2023年第十四届省赛真题-阶乘求和

一、题目 【问题描述】 令 S 1 ! 2 ! 3 ! . . . 202320232023 ! S 1! 2! 3! ... 202320232023!S1!2!3!...202320232023!&#xff0c;求 S SS 的末尾 9 位数字。 提示&#xff1a;答案首位不为 0。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后…

【UE5】动画蒙太奇简述

项目资源文末百度网盘自取 动画蒙太奇基本功能 动画蒙太奇&#xff08;Animation Montage&#xff09; 可以将多个 动画序列&#xff08;Animation Sequences&#xff09; 合并为单个资产并通过蓝图播放&#xff0c;还可以将一个蒙太奇动画切分为多个 蒙太奇分段&#xff08;M…

六大排序精解

排序概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#x…