Facade 外观对象结构模式

来源:互联网 发布:淘宝刷客怎么判刑2016 编辑:程序博客网 时间:2024/06/03 04:31

     Facade 外观对象结构模式:为子系统中的一级接口提供了一个一致的界面,Facade 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

     Facade 的意图是希望简化原有系统的使用方式,定义自己的接口。当我们只需要使用某个复杂系统的子集,或者,需要以一种特殊的方式与系统交互时,可以使用 Facade 模式。Facade 适用于模式适用于:

1)当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类,这使得子系统更具有可重用性,也更容易对子系统进行定制,但也给那些不需要定制子系统的用户带来一些使用上的困难。Facade 可以提供一个简单的缺省视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过 Facade 层。

2)客户程序与抽象类的实现部分之间存在着很大的依赖性。引入 Facade 将这个子系统与客户以及其它的子系统分离,可以提高子系统的独立性和可移植性

3)当你需要构建一个层次结构的子系统时,使用 facade 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们通过 facade 进行通讯,从而简化了它们之间的依赖关系。

Facade 的简单结构图如下:

 Facade

Facade 模式的想法及结构图都非常简单,但却是应用最广泛的模式之一。以上类图可能太过简单,不足以表达 Facade 模式的真正涵义,设计模式一书给出的结构图更能表示 Facade 的作用:

facade1

Facade 知道哪些子类系统负责处理请求,将客户的请求代理给适当的子系统对象。SubSystem 实现子系统的功能,处理由 Facade 对象指派的任务,子系统没有 Facade 的任务相关信息,即没有指向 facade 的指针。Facade 将客户发送的请求转发给适当的子系统对象,尽管子系统中的有关对象在做实际工作,但 Facade 模式本身也必须将它的接口转换成子系统的接口。使用 Facade 的客户不需要直接访问子系统对象。

Facade 的简单代码如下:

   1:  //Facade.h
   2:  #pragma once
   3:  #include 
   4:   
   5:  class Subsystem1
   6:  {
   7:  public:
   8:      Subsystem1(){    }
   9:      ~Subsystem1(){    }
  10:      void Operation()
  11:      {
  12:          std::cout << "Subsystem1 operation.." << std::endl;
  13:      }
  14:  };
  15:  class Subsystem2
  16:  {
  17:  public:
  18:      Subsystem2(){    }
  19:      ~Subsystem2(){    }
  20:      void Operation()
  21:      {
  22:          std::cout << "Subsystem2 operation.." << std::endl;
  23:      }    
  24:  };
  25:   
  26:  // Facade 
  27:  class Facade
  28:  {
  29:  public:
  30:      Facade()
  31:      {
  32:          _subs1 = new Subsystem1();
  33:          _subs2 = new Subsystem2();
  34:      }
  35:      ~Facade()
  36:      {
  37:          delete _subs1;
  38:          delete _subs2;
  39:      }
  40:   
  41:      void OperationWrapper()
  42:      {
  43:          _subs1->Operation();
  44:          _subs2->Operation();
  45:      }
  46:  private:
  47:      Subsystem1* _subs1;
  48:      Subsystem2* _subs2;
  49:  };
  50:   
  51:  int main()
  52:  {
  53:      Facade* f = new Facade();
  54:      f->OperationWrapper();
  55:   
  56:      return EXIT_SUCCESS;
  57:  }
  58:   
.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }
原创粉丝点击