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