首页 > 其他分享 >设计模式 18 中介者模式

设计模式 18 中介者模式

时间:2022-08-14 19:37:13浏览次数:81  
标签:String mediator 18 中介 User address 设计模式 public

参考源

https://www.bilibili.com/video/BV1u3411P7Na?p=26&vd_source=299f4bc123b19e7d6f66fefd8f124a03


中介者模式(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<String, User> 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);
}

输出结果为:

没有找到对应的房源
成功找到对应房源:(姓名:张三,电话:10086)

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

优缺点

优点

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

2、各个类之间的解耦。

3、符合迪米特原则。

缺点

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

使用场景

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

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

标签:String,mediator,18,中介,User,address,设计模式,public
From: https://www.cnblogs.com/codesail/p/16586096.html

相关文章

  • 设计模式 17 迭代器模式
    参考源https://www.bilibili.com/video/BV1u3411P7Na?p=25&vd_source=299f4bc123b19e7d6f66fefd8f124a03迭代器模式(IteratorPattern)属于行为型模式概述迭代器模......
  • 18第四章:03_延时消息
    一、延时消息当消息写入到Broker后,在指定的时长后才可被消费处理的消息,称为延时消息。采用RocketMQ的延时消息可以实现定时任务的功能,而无需使用定时器。典型的应用......
  • 设计模式 16 命令模式
    参考源https://www.bilibili.com/video/BV1u3411P7Na?p=24&vd_source=299f4bc123b19e7d6f66fefd8f124a03命令模式(CommandPattern)属于行为型模式概述现在各大电子......
  • 【MIT18.06·线性代数02】
    线性方程组的矩阵形式可以将线性方程组写成\(Ax=b\)的矩阵相乘形式:比如线性方程组\(\left\{\begin{matrix}\begin{aligned}2x-y&=0\\-x+2y&=3\end{aligned}\end......
  • Vulfocus靶场 | empirecms 文件上传 (CVE-2018-18086)
    漏洞描述EmpireCMS(帝国网站管理系统)是一套内容管理系统(CMS)。EmpireCMS7.5版本中的e/class/moddofun.php文件的‘LoadInMod’函数存在安全漏洞。攻击者可利用该漏洞上传......
  • Nginx分布式框架详解-基础18-21nginx服务升级
    nginx服务的命令行控制此方式是通过Nginx安装目录下的sbin下的可执行文件nginx(文件名)来进行对Nginx状态的控制,我们可以通过nginx-h来查看都有哪些参数可以......
  • 【MIT18.06·线性代数01】过去对线性方程组的理解
    如何理解一个线性方程组?考虑这样一个方程组:\(\left\{\begin{matrix}\begin{aligned}2x-y&=0\\-x+2y&=3\end{aligned}\end{matrix}\right.\)在之前的理解方式中,求......
  • 18.现在分词
    1.现在分词的构成和特征  现在分词一般由“动词原形+a“构成,及物动词的理左分词可以带宾语,也可以被状语修饰。不及物动词的现在分词不可以直接写宾语,但可以被状语修......
  • CF 1600~1800 思维题泛做
    CF1592CBakryandPartitioning给定一棵\(n\)个节点,每个节点有点权的树,最多拆成\(k\)个连通块,问是否有方案使得所有联通块的异或和相等。\(n,k\le10^5,a_i\l......
  • NC21467 [NOIP2018]货币系统
    题目链接题目题目描述在网友的国度中共有n种不同面额的货币,第i种货币的面额为a[i],你可以假设每一种货币都有无穷多张。为了方便,我们把货币种数为n、面额数组为a[1..n]的......