设计模式 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<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、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项

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


参考

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

posted @ 2022-08-14 19:21  天航星  阅读(18)  评论(0编辑  收藏  举报