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

 

注意:

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

 
posted @ 2023-02-11 15:00  kuaiquxie  阅读(37)  评论(0编辑  收藏  举报