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

        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);
    }

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

    @Override
    public 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<>();
            }
        }
    }
    @Override
    public void register(String name, Landlord landlord) {
        landlordMap.put(name,landlord);
    }

    @Override
    public void unRegister(String name) {
        landlordMap.remove(name);
    }

    /**
     * 将客户出的价格,去轮询各个卖家是否有意向
     * @param price
     */
    @Override
    public 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愿意出售房子

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

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

相关文章

数据结构的概念大合集06(树和二叉树)

概念大合集06 1、树1.1 树的相关定义1.2 树的基本运算1.3 树的基本术语1.3.1 结点的度&#xff0c;树的度1.3.2 分支结点&#xff0c;叶子节点1.3.3 路径&#xff0c;路径长度1.3.4 孩子结点&#xff0c;双亲结点&#xff0c;兄弟结点1.3.5 结点层次&#xff0c;树的高度1.3.6 …

sentinel中StatisticSlot数据采集的原理

StatisticSlot数据采集的原理 时间窗口 固定窗口 在固定的时间窗口内&#xff0c;可以允许固定数量的请求进入&#xff1b;超过数量就拒绝或者排队&#xff0c;等下一个时间段进入, 如下图 时间窗长度划分为1秒 单个时间窗的请求阈值为3 上述存在一个问题, 假如9:18:04:…

C语言 数组指针 指针数组

指针数组 什么是指针数组&#xff0c;他是一个数组&#xff0c;数组的元素是指针。但是指针也有多种数据类型&#xff0c;有数组指针、函数指针、整形指针、字符串指针。 现在我就使用函数指针来写代码&#xff0c;也就是函数指针数组的应用代码&#xff1a; #include <s…

基于SpringBoot和Vue的课程作业管理系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的课程作业管理系统的设计与实现。 &#xff01;&#xff01;&#xff01; 有需要的小伙伴可以通过文章末尾名片咨询我哦&#xff01;&#xff01;&#xff01; &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&am…

权限提升-Windows权限提升篇数据库篇MYSQLMSSQLORACLE自动化项目

知识点 1、Web到Win-数据库提权-MSSQL 2、Web到Win-数据库提权-MYSQL 3、Web到Win-数据库提权-Oracle 章节点&#xff1a; 1、Web权限提升及转移 2、系统权限提升及转移 3、宿主权限提升及转移 4、域控权限提升及转移 基础点 0、为什么我们要学习权限提升转移技术&#xff1…

ST表和并查集【2024蓝桥杯0基础】-学习笔记

文章目录 ST表-用于优化RMQ问题状态分析例题分析代码复现 并查集例题分析1代码复现 例题分析2状态分析代码复现 合并并查集的方法启发式合并&#xff1a;按照子树的节点大小按秩合并&#xff1a;按照子树的深度 可撤销并查集带权并查集代码复现 例题分析思路分析 感悟 ST表-用于…

android emulator windows bat启动

android emulator windows bat启动 先上结果 // 模拟器路径 -netspeed full -avd 模拟器名称 C:\Users\name\AppData\Local\Android\Sdk\emulator\emulator.exe -netdelay none -netspeed full -avd Pixel_3a_API_34_extension_level_7_x86_64一般来说 windows 如果不做…

小游戏-扫雷

扫雷大多人都不陌生&#xff0c;是一个益智类的小游戏&#xff0c;那么我们能否用c语言来编写呢&#xff0c; 我们先来分析一下扫雷的运行逻辑&#xff0c; 首先&#xff0c;用户在进来时需要我们给与一个菜单&#xff0c;以供用户选择&#xff0c; 然后我们来完善一下&#…

Mac电脑高清媒体播放器:Movist Pro for mac下载

Movist Pro for mac是一款专为Mac操作系统设计的高清媒体播放器&#xff0c;支持多种常见的媒体格式&#xff0c;包括MKV、AVI、MP4等&#xff0c;能够流畅播放高清视频和音频文件。Movist Pro具有强大的解码能力和优化的渲染引擎&#xff0c;让您享受到更清晰、更流畅的观影体…

疫情居家办公OA系统设计与实现| Mysql+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW&#xff0c;文末可获取本项目的所有资料。 推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java&#xff0c;…

Netty剖析 - Why Netty

文章目录 Why NettyI/O 请求的两个阶段I/O 模型Netty 如何实现自己的 I/O 模型线程模型 - 事件分发器&#xff08;Event Dispather&#xff09;弥补 Java NIO 的缺陷更低的资源消耗网络框架的选型Netty 发展现状Netty 的使用 Why Netty I/O 模型、线程模型和事件处理机制优化&a…

Spring Cloud四:微服务治理与安全

Spring Cloud一&#xff1a;Spring Cloud 简介 Spring Cloud二&#xff1a;核心组件解析 Spring Cloud三&#xff1a;API网关深入探索与实战应用 文章目录 一、服务注册中心的选型与最佳实践1. 主流服务注册中心概述2. 最佳实践建议(1)、选型建议(2)、高可用性与稳定性1). 高可…

游戏引擎中的地形系统

一、地形的几何 1.1 高度图 记录不同定点的高度&#xff0c;对每个网格/顶点应用高度、材质等信息&#xff0c;我们每个顶点可以根据高度改变位移 但是这种方法是不适用于开放世界的。很难直接画出几百万公里的场景 1.2 自适应网格细分 当fov越来越窄的时候&#xff0c;网格…

学习SpringBoot笔记--知识点(1)

目录 SpringBoot介绍 创建一个最基础的springbooot项目 使用Spring Initializr创建springboot项目 Spring Boot 自动配置机制 SpringBoot常用注解 1.组件注册 2.条件注解 3.属性绑定 SpringBoot自动配置流程​编辑 学习SpringBoot的方法 ​编辑 SpringBoot日志配置…

机器学习周记(第三十一周:文献阅读-GGNN)2024.3.18~2024.3.24

目录 摘要 ABSTRACT 1 论文信息 1.1 论文标题 1.2 论文模型 1.2.1 数据处理 1.2.2 门控图神经网络 1.2.3 掩码操作 2 相关知识 2.1 图神经网络&#xff08;GNN&#xff09; 2.2 图卷积神经网络&#xff08;GCN&#xff09; 3 相关代码 摘要 本周阅读了一篇利用图神…

银行监管报送系统介绍(六):客户风险数据报送系统

【概念定义】 银监会决定从2013年起实行新版客户风险统计制度&#xff0c;对各政策性银行、国有商业银行、股份制商业银行进行客户信息汇总统计。 客户风险统计信息&#xff0c;是指新版客户风险统计报送信 息。客户风险统计报送信息包括但不限于对公及同业客户授信和 表内外业…

ClickHouse--11--物化视图

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1.物化视图什么是物化视图? 1.1 普通视图1.2 物化视图1.3 优缺点1.4 基本语法1.5 在生产环境中创建物化视图1.6 AggregatingMergeTree 表引擎3.1 概念3.2 Aggregat…

【Linux】Linux工具学习之git

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 前言一、账号注册1.1 GitHub与Gitee 二、构建仓库三、安装git 四、配置git五、克…

树状数组原理和代码

树状数组 求下标的对应 求i管着的下标的范围 方法&#xff1a;拆掉最右侧的1然后1 到你自己 query sum 1-i的和 拆掉最右侧的1 再把下一个数值吸收到sum 重复这个过程直到全变0为止 add 方法&#xff1a;加上最右侧的1 到上限为止 lowbit方法 单点增加范围查询模板 #inc…

Redis持久化【RDB,bgsave的写时复制机制】【AOF,aof重写机制】【Redis混合持久化,以及对应改变aof重写规则】【Redis数据备份策略】

Redis持久化 RDB快照&#xff08;snapshot&#xff09;bgsave的写时复制(COW)机制 AOF&#xff08;append-only file&#xff09;AOF重写 Redis 4.0 混合持久化开启持久化后&#xff0c;AOF重写规则发生了变化 Redis数据备份策略&#xff1a; 转自 图灵课堂 RDB快照&#xff0…