中介者模式(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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。