(结构型模式)Facade——外观模式

1、意图

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

2、核心思想

     外部与一个子系统的通信必须通过一个统一的外观对象进行。外观模式提供一个高层次的接口,使得子系统更易于使用。每一个子系统只有一个外观类,而且此外观类只有一个实例,也就是还说它是一个单例模式。但整个系统可以有多个外观类。

3、优缺点分析

GOOD:

为子系统的一组接口提供一个一致的界面。使用户使用起来更加方便。

完美体现了依赖倒转原则和迪米特原则

适用情况:

分三个阶段:

1、首先,在设计初期阶段,应该有意识的将不同的两个层分离,即在层与层之间建立外观Facade

2、其次,在开发阶段,子系统往往因为不断的重构演化,而变得越来越复杂,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。

3、在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,就可以为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。

4、标准UML图

clip_image002

 

外观类:

Facade:知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象。所以它需要了解所有的子系统的方法或属性,进行组合,以备外界调用。

(与外观类相关联)子系统类集合:

SubSystem Classes:实现了子系统的具体功能,处理Facade对象指派的任务。(注意:子系统类中没有任何Facade的信息,既没有对Facade对象进行引用

5、标准源码

   1: #include<iostream>
   2: #include <string>
   3: using namespace std;
   4:  
   5: class SubSysOne
   6: {
   7: public:
   8:     void MethodOne()
   9:     {
  10:         cout<<"方法一"<<endl;
  11:     }
  12: };
  13:  
  14: class SubSysTwo
  15: {
  16: public:
  17:     void MethodTwo()
  18:     {
  19:         cout<<"方法二"<<endl;
  20:     }
  21: };
  22:  
  23: class SubSysThree
  24: {
  25: public:
  26:     void MethodThree()
  27:     {
  28:         cout<<"方法三"<<endl;
  29:     }
  30: };
  31:  
  32: //外观类
  33: class Facade
  34: {
  35: private:
  36:     SubSysOne* sub1;
  37:     SubSysTwo* sub2;
  38:     SubSysThree* sub3;
  39: public:
  40:     Facade()
  41:     {
  42:         sub1 = new SubSysOne();
  43:         sub2 = new SubSysTwo();
  44:         sub3 = new SubSysThree();
  45:     }
  46:     ~Facade()
  47:     {
  48:         delete sub1;
  49:         delete sub2;
  50:         delete sub3;
  51:     }
  52:  
  53:     void FacadeMethod()
  54:     {
  55:         sub1->MethodOne();
  56:         sub2->MethodTwo();
  57:         sub3->MethodThree();
  58:     }
  59: };
  60:  
  61: //客户端
  62: int main()
  63: {
  64:     Facade* test = new Facade();
  65:     test->FacadeMethod();
  66:     return 0;
  67: }
posted @ 2010-05-31 09:41  红脸书生  阅读(485)  评论(0编辑  收藏  举报