设计模式 18 中介者模式

中介者模式(Mediator Pattern)属于 行为型模式

一提到中介,大家都非常熟悉,生活中最常见的就是房屋中介。

虽然中介要收取一定费用,但却能给房东和租客都提供大量遍历,房东只需要把房屋信息提供给中介,租客也只需要将租金交给中介,由中介处理中介环节,给两方都提供了便利。这就是中介模式的应用。

这里以房屋中介来介绍中介模式:

1、定义用户

/**
 * 用户
 */
public class User {

    /**
     * 姓名
     */
    private final String name;

    /**
     * 电话
     */
    private final String phone;

    /**
     * 构造姓名和电话
     * @param name 姓名
     * @param phone 电话
     */
    public User(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    /**
     * 需要具体想找的地址和中介
     * @param address 地址
     * @param mediator 中介
     * @return 用户
     */
    public User find(String address, Mediator mediator) {
        // 中介根据地址找房
        return mediator.find(address);
    }

    @Override
    public String toString() {
        return "(姓名:" + name + ",电话:" + phone + ")";
    }

}

2、定义中介

/**
 * 中介
 */
public class Mediator {

    /**
     * 存储在售房屋
     */
    private final Map userMap = new HashMap<>();

    /**
     * 登记房屋
     * @param address 地址
     * @param user 用户
     */
    public void register(String address, User user) {
        userMap.put(address, user);
    }

    /**
     * 查找房源
     * @param address 地址
     * @return 房东
     */
    public User find(String address) {
        return userMap.get(address);
    }

}

3、调用

// 房东
User landlord = new User("张三", "10086");
// 租客
User tenant = new User("李四", "10010");
// 中介
Mediator mediator = new Mediator();
// 中介登记房产
mediator.register("重庆市北碚区金科小区", landlord);
// 租客委托中介查找符合要求房子的房东
User result = tenant.find("重庆市北碚区龙湖小区", mediator);
if (result == null) {
    System.out.println("没有找到对应的房源");
} else {
    System.out.print("成功找到对应房源:");
    System.out.println(result);
}
// 再次查找
result = tenant.find("重庆市北碚区金科小区", mediator);
if(result == null) {
    System.out.println("没有找到对应的房源");
} else {
    System.out.print("成功找到对应房源:");
    System.out.println(result);
}

输出结果为:

&#x6CA1;&#x6709;&#x627E;&#x5230;&#x5BF9;&#x5E94;&#x7684;&#x623F;&#x6E90;
&#x6210;&#x529F;&#x627E;&#x5230;&#x5BF9;&#x5E94;&#x623F;&#x6E90;&#xFF1A;&#xFF08;&#x59D3;&#x540D;&#xFF1A;&#x5F20;&#x4E09;&#xFF0C;&#x7535;&#x8BDD;&#xFF1A;10086&#xFF09;

这样就实现了日常生活中的通过中介租房。中介者模式优化了原有的复杂多对多关系,而是将其简化为一对多的关系,更容易理解一些。

1、降低了类的复杂度,将一对多转化成了一对一。

2、各个类之间的解耦。

3、符合迪米特原则。

中介者会庞大,变得复杂难以维护。

1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。

2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

不应当在职责混乱的时候使用。

Original: https://www.cnblogs.com/codesail/p/16586096.html
Author: 程序航
Title: 设计模式 18 中介者模式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575044/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • leetcode 235. Lowest Common Ancestor of a Binary Search Tree 二叉搜索树的最近公共祖先(简单)

    一、题目大意 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:”对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个…

    Java 2023年6月14日
    076
  • JAVA SSH 框架介绍(转)

    转载自:http://www.admin10000.com/document/150.html SSH 为 struts+spring+hibernate 的一个集成框架,是目前较…

    Java 2023年5月29日
    0115
  • 记一次log4j日志导致线上OOM问题案例

    最近一个服务突然出现 OutOfMemoryError,两台服务因为这个原因挂掉了,一直在full gc。还因为这个问题我们小组吃了一个线上故障。很是纳闷,一直运行的好好的,怎么突…

    Java 2023年6月7日
    096
  • M4宏什么鬼

    一 背景 本来以为通过上周的学习,已经对整个流程已经比较熟悉了,但是没想到还是遇到 undefined reference to问题,虽然很快通过添加依赖的类库解决了,但是为什么生…

    Java 2023年5月30日
    071
  • Intellij IDEA 2022 正式发布,这些功能真不错

    Intellij IDEA 2022 正式发布了,作为正版用户,胖哥赶紧更新了一波,好家伙!这几个功能确实很香啊。新版更新的东西真不少,不愧是一个大版本更新。 依赖分析 IDEA的…

    Java 2023年6月8日
    0149
  • Docker 常用操作

    .Docker的基本操作 1.镜像操作 1.1.镜像名称 首先来看下镜像的名称组成: 镜名称一般分两部分组成:[repository]:[tag]。 在没有指定tag时,默认是la…

    Java 2023年6月7日
    084
  • 好书推荐之《码出高效》、《阿里巴巴JAVA开发手册》

    好评如潮 《阿里巴巴Java开发手册》 简介 《阿里巴巴Java开发手册》的愿景是码出高效,码出质量。它结合作者的开发经验和架构历程,提炼阿里巴巴集团技术团队的集体编程经验和软件设…

    Java 2023年6月15日
    085
  • 利用 XXL-JOB 实现灵活控制的分片处理

    本文讲述了一种利用 XXL-JOB 来进行分片任务处理的方法,另外加入对执行节点数的灵活控制。 场景 现在一张数据表里有大量数据需要某个服务端应用来处理,要求: 能够并行处理; 能…

    Java 2023年6月5日
    085
  • SpringBoot多数据源yaml配置

    1.配置多数据源 2.设置默认数据源 配置中的 primary: db1 , 即是指定默认使用的数据库 spring: datasource: dynamic: primary: …

    Java 2023年6月15日
    087
  • java程序猿如何练习java版的易筋经?

    故事背景 电视剧《天龙八部》中,阿朱易容后进入少林寺偷走了《易筋经》,她一直想把这本书送给乔峰。耿直的乔峰觉得此书来历不正,不肯接受。几番波折,这本书最后落到聚贤庄庄主游坦之手里。…

    Java 2023年5月29日
    075
  • 使用navicat连接远程linux mysql数据库出现10061未知故障

    1.问题描述 2.解决方案 vim /etc/mysql/mysql.conf.d/mysqld.cnf 注释掉 bind-address=127.0.0.1 重启MySQL服务器…

    Java 2023年6月15日
    079
  • nacos集群搭建

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月13日
    061
  • Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点

    &#x53C2;&#x8003;&#x4E86;Spring &#x5B98;&#x7F51;&#x6587;&#x6863…

    Java 2023年6月14日
    068
  • Java虚拟机16:Metaspace

    被废弃的持久代 想起之前面试的时候有面试官问起过我一个问题:Java 8为什么要废弃持久代即Metaspace的作用。由于当时使用的Java 7且研究重心不在JVM上,一下没有回答…

    Java 2023年5月29日
    075
  • 限流常规设计和实例

    限流算法 计数器限流 固定窗口 滑动窗口 桶限流 令牌桶 漏桶 计数器 计数器限流可以分为: 固定窗口 滑动窗口 固定窗口 固定窗口计数器限流简单明了,就是限制单位之间内的请求数,…

    Java 2023年6月14日
    052
  • Galaxy Nexus 全屏显示-隐藏Navigation Bar

    Sumsung Galaxy Nexus 屏幕分辨率为 1280X 720,但通常的应用都会显示Navigation Bar(Back 键,Home 键等),如下图所示: 但我注意…

    Java 2023年5月29日
    0244
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球