设计模式-中介者模式

news2024/11/17 1:56:58

中介者模式

  • 问题背景
  • 中介者设计模式
    • 基本介绍
    • 原理
  • 问题解决-代码示例
  • 注意事项和细节

问题背景

一提到中介,我们首先就能想到租房中介,有租房中介在我们需要租房子的时候可以给我们节省很大精力。

那没有中介我们要怎么租房呢?

我们可以想象一下,因为我们对房子的需求不一样,我们身边的朋友不一定有适合的房子租给我们。我们就只能让朋友帮忙看看身边有没有拥有这样的房子。朋友问了以前自己亲戚朋友发现也没有这样的房子,就拜托亲戚朋友来帮忙去寻找,就这样一直依赖下去。

我们来将这个逻辑转换为UML类图来看看:
在这里插入图片描述
我们从这个类图来看,耦合性是多么的强,每一个亲戚朋友都要聚合到类中,每一个类都要写一个独立的方法来去寻找房子,这是多么大的工作量。

所以就出现了中介

我们来看一下有了中介后我们的租房UML类图

在这里插入图片描述
从这张图我们可以看出,每一个类都不需要去聚合很多类了,大大降低了耦合性,我们要租房只需要向中介说出需求,中介来告诉我们跟哪个房东租就可以了。房东有了房子告诉中介,中介让客户来直接联系房东即可。

中介者设计模式

基本介绍

1)中介者模式(Mediator Pattern),用一个中介对象来封装一系列对象交互。中介者使各个对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变他们之间地交互
2)中介者模式属于行为型模式,使代码易于维护

原理

在这里插入图片描述
1)Mediator抽象类就是中介者,定义了同事对象到中介者对象地接口
2)Colleague是抽象同事类
3)ConcreteMediator类是具体的中介者对象,实现抽象类Mediator,它需要知道所有的具体的同事类,存放在容器中。并且需要支持相应的操作来完成具体的任务
4)ConcreteColleague是具体的同事类,每个同事只知道自己的具体行为,不了解其他同事的行为,但是他们都依赖中介者对象,需要将自己交给中介者对象

问题解决-代码示例

房东接口

public interface HouseMaster {

    String getMobile();
}

中介抽象类

public abstract class Mediator {
    /**
     * 房东将房子注册到中介
     *
     * @param homeType
     * @param houseMaster
     */
    public abstract void add(String homeType, HouseMaster houseMaster);

    /**
     * 用户通过房子类型得到房东
     *
     * @param homeType
     * @return
     */
    public abstract HouseMaster get(String homeType);

}

房东一

public class HouseMaster01 implements HouseMaster{

    /**
     * 房子类型
     */
    private String homeType;

    /**
     * 联系方式
     */
    private String mobile = "12312312312";

    public HouseMaster01(String homeType, Mediator mediator) {
        this.homeType = homeType;
        mediator.add(homeType, this);
    }

    @Override
    public String getMobile() {
        return this.mobile;
    }
}

房东二

public class HouseMaster02 implements HouseMaster{

    /**
     * 房子类型
     */
    private String homeType;

    /**
     * 联系方式
     */
    private String mobile = "98798798798";

    public HouseMaster02(String homeType, Mediator mediator) {
        this.homeType = homeType;
        mediator.add(homeType, this);
    }

    @Override
    public String getMobile() {
        return this.mobile;
    }
}

房东三

public class HouseMaster03 implements HouseMaster{

    /**
     * 房子类型
     */
    private String homeType;

    /**
     * 联系方式
     */
    private String mobile = "56756756756";

    public HouseMaster03(String homeType, Mediator mediator) {
        this.homeType = homeType;
        mediator.add(homeType, this);
    }

    @Override
    public String getMobile() {
        return this.mobile;
    }
}

空实现

public class HouseMasterNoInfo implements HouseMaster{

    public HouseMasterNoInfo() {

    }

    @Override
    public String getMobile() {

        return null;
    }
}

中介类

public class ConcreteMediator extends Mediator{

    /**
     * 容器
     */
    private Map<String, HouseMaster> map = new HashMap<>();

    @Override
    public void add(String homeType, HouseMaster houseMaster) {
        map.put(homeType, houseMaster);
    }

    @Override
    public HouseMaster get(String homeType) {
        return map.getOrDefault(homeType, new HouseMasterNoInfo());
    }
}

租房测试代码

public class Client {
    public static void main(String[] args) {
        // 房屋中介
        ConcreteMediator concreteMediator = new ConcreteMediator();

        // 房东一
        new HouseMaster01("一室一厅", concreteMediator);
        // 房东二
        new HouseMaster02("两室一厅", concreteMediator);

        // 寻找房子-两室一厅
        HouseMaster houseMaster = concreteMediator.get("两室一厅");
        System.out.println(houseMaster.getMobile());

        // 寻找房子-三室一厅
        HouseMaster houseMaster1 = concreteMediator.get("三室一厅");
        System.out.println(houseMaster1.getMobile());

        // 房东三
        new HouseMaster03("三室一厅", concreteMediator);

        // 寻找房子-三室一厅
        HouseMaster houseMaster2 = concreteMediator.get("三室一厅");
        System.out.println(houseMaster2.getMobile());
    }
}

运行结果:
在这里插入图片描述

注意事项和细节

1)多个类相互耦合,会形成网状结构,使用中介者模式将网状结构分离为星型结构进行解耦
2)减少类间依赖,降低了耦合,符合迪米特原则
3)中介者承担了较多的责任,一旦中介者出现了问题,整个系统就会受到影响
4)如果设计不当,中介者对象本身变得过于复杂,这点在实际使用时,要特别注意

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

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

相关文章

English Learning - L3 作业打卡 Lesson4 Day25 2023.5.29 周一

English Learning - L3 作业打卡 Lesson4 Day25 2023.5.29 周一 引言&#x1f349;句1: My husband has a good job.成分划分弱读连读爆破语调 &#x1f349;句2: He makes enough money to support our family.成分划分弱读连读语调 &#x1f349;句3: So we say he brings ho…

防火墙之部署服务器NAT

防火墙部署服务器NAT 原理概述&#xff1a; NAT&#xff08;Network Address Translation&#xff09;&#xff0c;是指网络地址转换&#xff0c;1994年提出的。 当在专用网内部的一些主机本来已经分配到了本地IP地址&#xff08;即仅在本专用网内使用的专用地址&#xff09;&a…

离散化以及树状数组

今天我们先来讲一讲什么叫做离散化&#xff08;简单的映射关系&#xff09; 一、离散化 一、概念&#xff1a;就是把一个无限的空间去映射到一个有限的空间中去&#xff08;通俗的可以理解成将数据相应的缩小&#xff09;为了更好的理解&#xff0c;请看下图&#xff1a; 已知…

90后测试员:“入职阿里,这一次,我决定不跳槽了...”

所谓“舒适”生活 记得上一份工作是去年听从了朋友的意见&#xff0c;“你一定要找一份舒适的工作&#xff0c;这样你一天就有好多时间玩&#xff0c;好多时间干自己想干的事情&#xff0c;摸鱼真香&#xff01;” 在这份“教导”下&#xff0c;开始了我的找工作之旅&#xf…

Day972.OAuth 2.0是要通过什么方式解决什么问题? -OAuth 2.0

OAuth 2.0是要通过什么方式&#xff1f;解决什么问题&#xff1f; 使用某个App 的时候&#xff0c;是直接使用了第三方帐号&#xff08;比如微信、微博&#xff09;登录&#xff0c;还是选择了重新注册新用户&#xff1f;如果选择了重新注册用户&#xff0c;那你还得上传头像、…

DPDK imissed、ierrors、rx_nombuf

在采用DPDK进行网络抓包时常常会通过rte_eth_stats_get函数获取当前网卡的丢包状态&#xff0c;首先看一下该函数的声明&#xff1a; // 函数声明(dpdk-stable-19.11.3/lib/librte_ethdev/rte_ethdev.h) int rte_eth_stats_get(uint16_t port_id, struct rte_eth_stats *stats…

高级程序员和新手小白程序员区别你是那个等级看解决bug速度

IT入门深似海 ,程序员行业&#xff0c;我觉得是最难做的。加不完的班&#xff0c;熬不完的夜。 和产品经理&#xff0c;扯不清,理还乱的宿命关系 一直都在 新需求-做项目-解决问题-解决bug-新需求 好像一直都是这么一个循环。&#xff08;哈哈哈&#xff09;我觉得一个好的程序…

【传染病模型】

传染病模型&#xff1a;原理介绍与应用实战 一、概述 在公共卫生研究中&#xff0c;传染病模型是一种关键的理论工具&#xff0c;用于理解和预测传染病的传播方式。 二、传染病模型原理 2.1 SIR模型 SIR模型是描述感染性传播病病人数量变化最简单的模型之一。其中&#xf…

不要再重复造轮子了,这几款开源工具类库贼好使

在实际项目开发中&#xff0c;从稳定性和效率的角度考虑&#xff0c;重复造轮子是不被提倡的。但是&#xff0c;自己在学习过程中造轮子绝对是对自己百利而无一害的&#xff0c;造轮子是一种特别能够提高自己系统编程能力的手段。 基于 SpringBoot Vue uni-app 实现的全套电商…

小白如何快速入门?

入门 Web 安全、安卓安全、二进制安全、工控安全还是智能硬件安全等等&#xff0c;每个不同的领域要掌握的技能也不同。当然入门 Web 安全相对难度较低&#xff0c;也是很多人的首选。主要还是看自己的兴趣方向吧。 本文就以下几个问题来说明网络安全大致学习过程&#x1f447…

【CSS3系列】第三章 · CSS3新增边框和文本属性

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

5月总共面试15次,我真哭了....

3年测试经验原来什么都不是&#xff0c;只是给你的简历上画了一笔&#xff0c;一直觉得经验多&#xff0c;无论在哪都能找到满意的工作&#xff0c;但是现实却是给我打了一个大巴掌&#xff01;事后也不会给糖的那种... 先说一下自己的个人情况&#xff0c;普通二本计算机专业…

【Spring Cloud】Spring Cloud 中 Zuul 网关原理及其配置

文章目录 前言一、Zuul 网关简介二、Zuul 网关使用场景三、Zuul 网关原理3.1 过滤器3.2 生成路由并发送给后端服务3.3 处理路由响应 四、Zuul 网关配置过程步骤1&#xff1a;添加依赖步骤2&#xff1a;创建配置类步骤3&#xff1a;配置路由规则步骤4&#xff1a;添加过滤器 五、…

【C# 10 和 .NET 6】使用MVC模式构建网站(笔记2)

3. 自定义 ASP.NET Core MVC 网站 现在您已经了解了基本 MVC 网站的结构&#xff0c;您将对其进行自定义和扩展。您已经为 Northwind 数据库注册了一个 EF Core 模型&#xff0c;因此下一个任务是在主页上输出一些数据。 3.1 定义自定义样式 主页将显示 Northwind 数据库中77 种…

常见的IO模型

计算机硬件包括CPU&#xff0c;内存&#xff0c;网卡 为了避免用户应用和操作系统内核产生冲突乃至内核崩溃&#xff0c;用户应用和内核是隔离开的 1)进程的寻址空间会被划分成两部分&#xff0c;内核空间和用户空间&#xff0c;内核和用户应用都无法直接访问物理内存&#xff…

【Vue】Vuex,Vue-Router

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 Vuexvue-router Vuex 将公用的数据统一存放在store(全局数据中心)中&#xff0c;实现更方便的跨…

从实习到秋招成为一名安全工程师,我经历了什么

前言 借朋友口述总结了安全招聘面试经历分享&#xff0c;希望更多的人看到这篇文&#xff0c;从中得到启发&#xff0c;找到自己心仪的工作。 基本情况 签了字节的三方&#xff0c;秋招终于告一段落。从八月份边实习边准备秋招到现在&#xff0c;经历了许多&#xff0c;这篇帖…

2023金三银四Java开发岗热门面试题总结

最近很多粉丝朋友私信我说&#xff1a;熬过了去年的寒冬却没熬过现在的内卷&#xff1b;打开 Boss 直拒一排已读不回&#xff0c;回的基本都是外包&#xff0c;薪资还给的不高&#xff0c;对技术水平要求也远超从前&#xff1b;感觉 Java 一个初中级岗位有上千人同时竞争&#…

都说00后已经躺平了,但是有一说一,该卷的还是卷啊。

这不&#xff0c;三月份春招我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪20K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 最近和他聊了一次天&#xff0c;原来这位小老弟家里条件不太好&…

Java学习路线(21)——网络通信

一、网络通信三件套 1、IP地址&#xff1a; 设备在网络中的地址&#xff0c;唯一标识 概念&#xff1a; Internet Protocal&#xff0c;简称为IP&#xff0c;全称“互联网协议地址”。 常见分类&#xff1a; IPv4&#xff08;32位&#xff09; 和 IPv6&#xff08;128位&#…