友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

13. 外观模式

13.1. 定义

根据 GoF 的著名著作 《设计模式》,外观模式的定义如下:

外观模式(Facade)

为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

— Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides
《设计模式》

13.2. 类图

Diagram

外观模式,也完全有可能在很多时候使用它,因为它完美地体现了依赖倒转原则和迪米特法则的思想,所以是非常常用的模式之一。

其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,

增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,

为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。[R2P]

依赖倒转原则?抽象不应该依赖细节,细节应该依赖于抽象,由于我们要吃的菜都依赖于厨师这样的细节,所以我们就很被动。

代码 82. facade/Client.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
package com.diguage.didp.facade;

/**
 * Client 类
 *
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-19 17:53:34
 */
public class Client {
  public static void main(String[] args) {
    Facade facade = new Facade();
    facade.methodA();
    facade.methodB();
  }
}
代码 83. facade/Facade.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.diguage.didp.facade;

/**
 * Facade 类
 *
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-19 17:53:34
 */
public class Facade {
  private SubSystemOne systemOne;
  private SubSystemTwo systemTwo;
  private SubSystemThree systemThree;
  private SubSystemFour systemFour;

  public Facade() {
    systemOne = new SubSystemOne();
    systemTwo = new SubSystemTwo();
    systemThree = new SubSystemThree();
    systemFour = new SubSystemFour();
  }

  public void methodA() {
    System.out.println("方法A() ---");
    systemOne.methodOne();
    systemTwo.methodTwo();
  }

  public void methodB() {
    System.out.println("方法B() ---");
    systemFour.methodFour();
    systemThree.methodThree();
  }
}
代码 84. facade/SubSystemFour.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package com.diguage.didp.facade;

/**
 * SubSystemFour 类
 *
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-19 17:53:34
 */
public class SubSystemFour {
  public void methodFour() {
    System.out.println("子系统四的方法");
  }
}
代码 85. facade/SubSystemOne.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package com.diguage.didp.facade;

/**
 * SubSystemOne 类
 *
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-19 17:53:34
 */
public class SubSystemOne {
  public void methodOne() {
    System.out.println("子系统一的方法");
  }
}
代码 86. facade/SubSystemThree.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package com.diguage.didp.facade;

/**
 * SubSystemThree 类
 *
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-19 17:53:34
 */
public class SubSystemThree {
  public void methodThree() {
    System.out.println("子系统三的方法");
  }
}
代码 87. facade/SubSystemTwo.java 类
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package com.diguage.didp.facade;

/**
 * SubSystemTwo 类
 *
 * @author D瓜哥, https://www.diguage.com/
 * @since 2017-05-19 17:53:34
 */
public class SubSystemTwo {
  public void methodTwo() {
    System.out.println("子系统二的方法");
  }
}

13.3. 常见示例

  1. java.lang.Class