外观模式

1. 什么是外观模式

Facade 模式也叫外观模式,是由 GoF 提出的 23 种设计模式中的一种。 Facade 模式为一组具有类似功能的类群,比如类库,子系统等等,提供一个一致的简单的界面。这个一致的简单的界面被称作 facade。

2. 外观模式的结构

10_外观模式 - 图1

3. 外观模式的角色和职责

  • Facade:为调用方定义简单的调用接口。
  • Clients:调用者。通过 Facade 接口调用提供某功能的内部类群。
  • Packages:功能提供者。指提供功能的类群(模块或子系统)。

4. 代码演示

4.1. 不使用外观模式

  1. public class SystemA {
  2. public void doSomething() {
  3. System.out.println("实现A子系统功能");
  4. }
  5. }
  1. public class SystemB {
  2. public void doSomething() {
  3. System.out.println("实现B子系统功能");
  4. }
  5. }
  1. public class SystemC {
  2. public void doSomething() {
  3. System.out.println("实现C子系统功能");
  4. }
  5. }
  1. SystemA systemA = new SystemA();
  2. systemA.doSomething();
  3. SystemB systemB = new SystemB();
  4. systemB.doSomething();
  5. SystemC systemC = new SystemC();
  6. systemC.doSomething();

4.2. 使用外观模式

  1. public class Facade {
  2. private final SystemA systemA;
  3. private final SystemB systemB;
  4. private final SystemC systemC;
  5. public Facade() {
  6. this.systemA = new SystemA();
  7. this.systemB = new SystemB();
  8. this.systemC = new SystemC();
  9. }
  10. public void doAbc() {
  11. this.systemA.doSomething();
  12. this.systemB.doSomething();
  13. this.systemC.doSomething();
  14. }
  15. public void doAb() {
  16. this.systemA.doSomething();
  17. this.systemB.doSomething();
  18. }
  19. }
  1. Facade facade = new Facade();
  2. facade.doAbc();
  3. System.out.println("==========");
  4. facade.doAb();
  1. 实现A子系统功能
  2. 实现B子系统功能
  3. 实现C子系统功能
  4. ==========
  5. 实现A子系统功能
  6. 实现B子系统功能

4.3. 买基金的例子

  1. public class GuPiao {
  2. public void chao() {
  3. System.out.println("炒股票");
  4. }
  5. }
  1. public class QiHuo {
  2. public void mai() {
  3. System.out.println("买期货");
  4. }
  5. }
  1. public class GuoZhai {
  2. public void mai() {
  3. System.out.println("买国债");
  4. }
  5. }
  1. public class JiJin {
  2. private final GuPiao guPiao;
  3. private final QiHuo qiHuo;
  4. private final GuoZhai guoZhai;
  5. public JiJin() {
  6. this.guPiao = new GuPiao();
  7. this.qiHuo = new QiHuo();
  8. this.guoZhai = new GuoZhai();
  9. }
  10. public void maiJiJinA() {
  11. this.guoZhai.mai();
  12. this.qiHuo.mai();
  13. }
  14. public void maiJiJinB() {
  15. this.guPiao.chao();
  16. this.qiHuo.mai();
  17. this.guoZhai.mai();
  18. }
  19. }
  1. JiJin jiJin = new JiJin();
  2. jiJin.maiJiJinA();
  3. System.out.println("==========");
  4. jiJin.maiJiJinB();
  1. 买国债
  2. 买期货
  3. ==========
  4. 炒股票
  5. 买期货
  6. 买国债