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

news2024/9/26 1:18:16

        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愿意出售房子

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

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

相关文章

Rust并发编程thread多线程和channel消息传递

安全高效的处理并发是 Rust 诞生的目的之一&#xff0c;主要解决的是服务器高负载承受能力。 并发&#xff08;concurrent&#xff09;的概念是指程序不同的部分独立执行&#xff0c;这与并行&#xff08;parallel&#xff09;的概念容易混淆&#xff0c;并行强调的是"同…

npm、nrm、nvm详解与应用

本文全面介绍了 npm、nrm 以及 nvm 这三个与 Node.js 开发密切相关的工具。首先&#xff0c;对 npm 进行了定义和功能解释&#xff0c;包括其在依赖管理、项目管理、脚本执行、版本控制和社区贡献等方面的作用。接着&#xff0c;详细介绍了 npm 的常用命令和设置下载源的操作&a…

python综合实战案例-数据分析

Python是进行数据分析的好工具&#xff0c;今天就是借助一个案例给大家进行数据分析讲解。 本例设计一个log.txt⽂件&#xff0c;该文件记录了某个项⽬中某个 api 的调⽤情况&#xff0c;采样时间为每分钟⼀次&#xff0c;包括调⽤次数、响应时间等信息&#xff0c;⼤约18万条数…

java数据结构与算法刷题-----LeetCode451. 根据字符出现频率排序

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. hash统计出现次数后排序2. 桶排序 1. hash统计出现次数后排序…

WebClient 同步、异步调用实现对比

文章目录 一、概述二、pom依赖三、代码结构四、源码传送1、异步代码2、同步代码3、完整代码 一、概述 WebClient是Spring WebFlux模块提供的一个非阻塞的基于响应式编程的进行Http请求的客户端工具&#xff0c;从Spring5.0开始WebClient作为RestTemplete的替代品&#xff0c;有…

初探Flink集群【持续更新】

周末下雨&#xff0c;倒杯茶&#xff0c;在家练习Flink相关。 开发工具&#xff1a;IntelliJ Idea 第一步、创建项目 打开Idea&#xff0c;新建Maven项目&#xff0c;包和项目命名 在pom.xml 文件中添加依赖 <properties><flink.version>1.13.0</flink.vers…

python(django(自动化))之流程接口展示功能前端开发

1、创建模板代码如下&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>测试平台</title> </head> <body role"document"> <nav class "navbar n…

轻量级 C++ UI 库:快速、可移植、自包含 | 开源日报 No.168

ocornut/imgui Stars: 53.4k License: MIT imgui 是 C 的无臃肿图形用户界面&#xff0c;具有最小的依赖关系。 该项目的主要功能、关键特性、核心优势包括&#xff1a; 为 C 提供了一个轻量级的图形用户界面库输出优化的顶点缓冲区&#xff0c;可在 3D 渲染应用程序中随时呈…

2024/03/24----Pycharm社区版本下载以及创建一个新项目

1.本科安装过这个软件&#xff0c;因为系统重置了&#xff0c;所以重头再来一遍。 2.链接 社区版本Pycharm 3.我下载了2023.1.15的版本&#xff0c;越前面一些的版本可能会比较稳定 4.安装步骤 &#xff08;1&#xff09;先把文件安装目录改成其他盘(文件名最好不要有数字和符号…

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

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

Django 三板斧、静态文件、request方法

【一】三板斧 【1】HttpResponse &#xff08;1&#xff09;介绍 HttpResponse是Django中的一个类&#xff0c;用于构建HTTP响应对象。它允许创建并返回包含特定内容的HTTP响应。 &#xff08;2&#xff09;使用 导入HttpResponse类 from django.http import HttpResponse创…

Python学习从0到1 day18 Python可视化基础综合案例 1.折线图

我默记这段路的酸楚&#xff0c;等来年春暖花开之时再赏心阅读 —— 24.3.24 python基础综合案例 数据可视化 — 折线图可视化 一、折线图案例 1.json数据格式 2.pyecharts模块介绍 3.pyecharts快速入门 4.数据处理 5.创建折线图 1.json数据格式 1.什么是json 2.掌握如何使用js…

【云开发笔记No.9】Kanban与敏捷开发

Kanban看板起源于丰田。 看板&#xff08;Kanban&#xff09;一词来自日文&#xff0c;本义是可视化卡片。如下图所示&#xff0c;看板工具的实质是&#xff1a;后道工序在需要时&#xff0c;通过看板向前道工序发出信号——请给我需要数量的输入&#xff0c;前道工序只有得到看…

阿里云4核16G服务器优惠价格26元1个月、149元半年

阿里云4核16G服务器优惠价格26.52元1个月、79.56元3个月、149.00元半年。2024年腾讯云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也…

[iOS]GCD(一)

[iOS]GCD(一) 文章目录 [iOS]GCD(一)GCD的概要GCD的APIDispatch Queuedispatch_queue_createMain Dispatch_set_target_queuedispatch_afterDispatch Groupdispatch_barrier_asyncdispatch_applydispatch_applydispatch_suspend/dispatch_resumeDispatch Semaphoredispatch_onc…

力扣:290. 单词规律

前言&#xff1a;剑指offer刷题系列 问题&#xff1a; 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律…

大数据Spark--入门

文章目录 Spark 概述Spark 是什么Spark and HadoopSpark and HadoopSpark 核心模块 Spark 简单上手创建Maven项目增加 Scala 插件增加依赖关系WordCount异常处理 Spark 概述 Spark 所需资料 链接&#xff1a;https://pan.baidu.com/s/12iaW68vriL6i-xI1kmr0_g?pwdm4zc 提取码…

跨时钟域学习记录(一)

亚稳态 亚稳态是电平介于高低电平之间的一种暂时状态。在同步系统中&#xff0c;当寄存器的信号无法满足建立时间和保持时间时&#xff0c;输出端的信号就可能出现亚稳态。在异步系统中&#xff0c;亚稳态并非一定在建立时间和保持时间无法满足时出现。   受噪声、温度、电压…

MongoDB高可用架构涉及常用功能整理

MongoDB高可用架构涉及常用功能整理 1. mongo架构和相关组件1.1. Master-Slave主从模式1.2. Replica Set 副本集模式1.3. Sharding 分片模式 2. Sharding 分片模式2.1. Hashed Sharding方式2.2. Range Sharding方式 3. 事务性4. 疑问和思考4.1. 怎么保证数据的高可靠&#xff1…

oracle 19c RAC补丁升级

1.停止集群件备份家目录 ----两节点分别操作 cd /u01/app/19.3.0/grid/bin/ crsctl stop crstar -zcvf /u01/app.tar.gz /u01/app/u01/app/19.0.0/grid/bin/crsctl start crs2.两节点 GI、DB OPatch 替换&#xff08;都得执行&#xff09; ----# 表示 root 用户&#xff0c;$…