程序员怎能不会“中介者模式”,请耗子尾汁

543 阅读3分钟

今天让我们一起来了解一下中介者模式,希望通过本文的讲解大家可以更加深入的理解该模式。

基本介绍

中介者模式属于行为型设计模式的一种。

该模式的核心思想是:通过一个中介类来封装一系列的对象交互,让各对象之间不需要显示的相互引用,从而促使对象间的耦合度降低。

举个栗子

小明想要租房,他比较笨采用最原始的方法走街串巷找寻最合适的房子。

经过一番周转,费了九牛二虎之力租到了合适的房子(不使用中介者模式)。

菜鸟也想要租房子,不过菜鸟聪明啊肯定不会自己瞎转,直接找到了中介。

通过中介,轻松搞定租房问题。这就是中介者模式的体现,中介类负责封装其它类,并与其进行交互。

中介者模式UML类图

UML类图讲解

Mediator:抽象中介者,定义了注册同事对象和与同事对象交互的方法。
ConcreteMediator:具体中介者,实现了抽象中介者中定义的方法。定义了集合用于管理同事对象。
Colleague:抽象同事类,聚合了抽象中介者对象。定义了所有具体同事类所需的公共方法。
ConcreteColleagueA/B:具体同事类,实现了抽象类中定义的方法。

案例讲解

案例:通过找中介租房的例子来讲解一下中介者模式。

房主 => 对应抽象同事类

public abstract class Homeowner {

  // 聚合中介者
  private Mediator mediator;

  public Homeowner(Mediator mediator) {
    this.mediator = mediator;
  }

  public abstract void signContract();

  public Mediator getMediator() {
    return mediator;
  }

}

具体同事类

/**
 * 地下室
 */
public class BasementHomeowner extends Homeowner {

  // 构造方法
  public BasementHomeowner(Mediator mediator) {
    super(mediator);
    this.getMediator().Register("地下室", this);
  }

  @Override
  public void signContract() {
    System.out.println("欢迎入住地下室,每月仅需500元!");
  }
}

/**
 * 别墅
 */
public class VillaHomeowner extends Homeowner {

  public VillaHomeowner(Mediator mediator) {
    super(mediator);
    this.getMediator().Register("别墅", this);
  }

  @Override
  public void signContract() {
    System.out.println("欢迎入住豪华别墅,每月只要5000元!");
  }
}

抽象中介者

public interface Mediator {

  // 注册同事对象
  void Register(String name, Homeowner homeowner);

  // 接收消息
  void receiveMessage(int price);
}

具体中介者

public class ConcreteMediator implements Mediator {

  private HashMap<String, Homeowner> homeownerMap;

  public ConcreteMediator() {
    this.homeownerMap = new HashMap<>();
  }

  @Override
  public void Register(String name, Homeowner homeowner) {
    homeownerMap.put(name, homeowner);
  }

  @Override
  public void receiveMessage(int price) {
    switch (price) {
      case 500:
        homeownerMap.get("地下室").signContract();
        break;
      case 5000:
        homeownerMap.get("别墅").signContract();
        break;
      default:
        System.out.println("没有你想要的房源,去别家看看吧!");
        break;
    }
  }
}

客户端测试类

public class Client {

  public static void main(String[] args) {
    // 创建中介者
    ConcreteMediator concreteMediator = new ConcreteMediator();

    // 创建具体房主
    BasementHomeowner basementHomeowner = new BasementHomeowner(concreteMediator);
    VillaHomeowner villaHomeowner = new VillaHomeowner(concreteMediator);

    concreteMediator.receiveMessage(5000);
  }
}

执行结果

总结

1、使用中介者模式可以将类之间多对多的关系转变成一对多的关系,降低类的复杂度。

2、中介者模式可以减少类之间的依赖、降低耦合度。

3、中介者类在该模式中承担的责任比较多,一旦出错整个系统都会受到影响。

4、中介者类会随着同事类的增多和业务的复杂而变得庞大,从而提升维护的难度。

今天的分享就到这里了,如果感觉“菜鸟”写的文章还不错,记得点赞关注呦!你们的支持就是我坚持下去的动力。文章哪里写的有问题的也希望大家可以指出,我会虚心受教。