【Java开发】设计模式 17:中介者模式
1 中介者模式介绍
中介者模式是一种行为设计模式,指用一个中介对象来封装一系列的对象交互。
中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。在这个模式中,中介者负责协调各个对象间的通信,使其流程更加清晰简单。
📌 场景
中介者模式可以应用于多个对象之间有复杂的交互关系的场景,例如一个大型软件系统中的模块之间的协作、多个部门之间的协作等。中介者模式可以简化对象之间的交互,使得对象之间的耦合度降低。具体来说,通过引入中介者对象,可以让对象之间的通信集中在中介者对象上,从而避免了对象之间的直接依赖关系,提高了系统的可维护性和可扩展性。
📌 优点
- 减少对象之间的耦合度:通过使用中介者对象,可以将系统中多个对象之间的相互作用关系简化为中介者与对象之间的一种关系,从而降低系统的复杂性。
- 提高系统的可扩展性:由于中介者模式将对象之间的相互作用关系抽象到中介者对象中,所以增加新的对象和中介者对象对原有系统的修改都是非常方便的。
- 降低系统的复杂度:中介者模式将多个对象之间的相互作用关系简化为中介者与对象之间的一种关系,使得系统的设计、实现变得更加简单。
📌 缺点
- 中介者对象会增加系统的复杂度:中介者对象需要处理多个对象之间的相互作用关系,所以它的设计和实现会比较复杂,这会增加系统的复杂度。
- 中介者对象可能会成为系统的瓶颈:由于中介者对象需要处理多个对象之间的相互作用关系,所以如果中介者对象的处理能力不足,可能会成为系统的瓶颈。
- 中介者模式会将原本分散的系统逻辑集中到一个地方:中介者模式将系统中多个对象之间的相互作用关系抽象到中介者对象中,因此原本分散的系统逻辑会集中到一个地方,这可能会使得系统的代码结构变得复杂。
2 中介者模式实现
以房屋中介为例:
📌 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);}@Overridepublic 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.调用
public class Client {public static void main(String[] args) {// 房东User landlord = new User("AA", "10011");// 租客User tenant = new User("BB", "10022");// 中介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);}}
}
控制台输出:
没有找到对应的房源
成功找到对应房源:(姓名:AA,电话:10011)
这样就实现了日常生活中的通过中介租房。