zoukankan      html  css  js  c++  java
  • [设计模式]外观模式

    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. 预防低水平人员带来的风险。

  • 相关阅读:
    WCF和SOA的简介
    .NET 反射应用
    ASP.NET---如何使用web api创建web服务
    获得N位数字字母随机组合
    git的初步使用
    js贪吃蛇
    python多线程
    2013-12-13
    2012-12-12
    2013-12-5
  • 原文地址:https://www.cnblogs.com/zhuangmingnan/p/9460186.html
Copyright © 2011-2022 走看看