[设计模式]外观模式

1. 定义

  外观模式 提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更加容易使用。

  外观不仅简化了系统内接口的使用,也将客户从组件中的子系统中解耦,外观和适配器都可以包装很多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成新的需要的接口。

2. 类图

  外观模式的主要目的是简化 子系统中较为复杂或者繁琐的方法调用,将所有方法调用集中到一个方法中,用户只需要和外观类交互即可,不需要知道组件中其他的方法和子对象,符合设计模式的“最少知道”原则。

3. 实现代码

  外观类的代码实现,这是面对客户的入口

/**
 * Class Facade
 */
public class Facade {

  //
  // Fields
  //

  private ClassA classA;
  private ClassB classB;
  private ClassC classC;

  //
  // Constructors
  //
  public Facade () { };

  //
  // Methods
  //


  //
  // Accessor methods
  //

  /**
   * Set the value of classA
   * @param newVar the new value of classA
   */
  private void setClassA (ClassA newVar) {
    classA = newVar;
  }

  /**
   * Get the value of classA
   * @return the value of classA
   */
  private ClassA getClassA () {
    return classA;
  }

  /**
   * Set the value of classB
   * @param newVar the new value of classB
   */
  private void setClassB (ClassB newVar) {
    classB = newVar;
  }
/**
   * Get the value of classB
   * @return the value of classB
   */
  private ClassB getClassB () {
    return classB;
  }

  /**
   * Set the value of classC
   * @param newVar the new value of classC
   */
  private void setClassC (ClassC newVar) {
    classC = newVar;
  }

  /**
   * Get the value of classC
   * @return the value of classC
   */
  private ClassC getClassC () {
    return classC;
  }

  //
  // Other methods
  //

  /**
   */
  public void actionAB()
  {
    classA.actionA();
    classB.actionB();
  }


  /**
   */
  public void actionAC()
  {
    classA.actionA();
    classC.actionC();
  }


  /**
   */
  public void actionABC()
 {
    classA.actionA();
    classB.actionB();
    classC.actionC();
  }
}

  这是外观类持有的子对象,也是子系统的内部对象

/**
 * Class ClassA
 */
public class ClassA {

  //
  // Constructors
  //
  public ClassA () { };

  /**
   */
  public void actionA()
  {
  }

}

  ClassB, ClassC 的代码类似ClassA的代码,此处不做展示。

4. 优势、劣势

  • 客户调用系统不需要繁琐、冗长的代码;
  • 客户不需要知道内部支持的各个步骤,只知道外观类的某个方法可以实现用户的某个目的,通过这样后期改造方法也会变得相对简单;

------------------------

  • 代码中需要多出外观类的代码
  • 不符合开闭原则,需要修改的时候,需要改动外观类代码
  • 对于需要经常定制化调用子组件的各种行为、方法的话,外观类并不适合,这时候应该暴露子类的访问接口供客户使用

5. 应用场景

  1. 为复杂的模块或子系统提供外界访问的模块。

  2. 子系统相对独立。

  3. 预防低水平人员带来的风险。

原文地址:https://www.cnblogs.com/zhuangmingnan/p/9460186.html