Facade外观模式(C++)

作者:hahaya
日期:2014-03-04

Facade模式是平常用得比较的一种模式了,即使没有听过外观模式,也可能在很多时候使用多了它,外观模式是依赖倒转原则和迪米特法则的完美体现。

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

将复杂的逻辑封装起来,通过增加一个Facade对象对外公开简单的接口,这样客户端在调用时只需要知道Facade对象的接口,而不用去了解子系统中复杂的逻辑,下图很好的解释Facade外观模式的左右(下图中左边为没有使用外观模式,右边为使用外观模式,并且子系统client与client之间还可能有相互调用关系,为了简单,没有将cleint于client之间的相互调用关系表示出来)

facade_purpose

facade_uml Facade:

  1. 知道哪些子系统类负责处理请求
  2. 将客户的请求代理给适当的子系统对象
    Subsystem Classes:
  3. 实现子系统的功能
  4. 处理由Facade对象指派的任务
  5. 没有Facade对象的任何相关信息,即没有Facade对象的指针或引用

客户程序通过发送请求给Facade对象的方式与子系统通讯,Facade对象将这些请求转发给实际的子系统对象。但是使用Facade外观模式有如下好处:

  1. 客户程序只需知道Facade对象提供的接口,不需要知道子系统内复杂的逻辑(client与client之间的相互调用)、具体细节

  2. Facade模式有助于建立层次结构系统,也有助于对对象间的依赖关系分层

  3. Facade模式可以消除复杂的循环依赖关系,降低客户程序与子系统直接的耦合度

  4. 使用Facade的客户程序不需要直接访问子系统对象

  5. #include <iostream>

  6. //子系统1

  7. class SubSystemOne

  8. {

  9. public:

  10. void MethodOne() { std::cout << "SubSystemOne" << std::endl; }

  11. };

  12. //子系统2

  13. class SubSystemTwo

  14. {

  15. public:

  16. void MethodeTwo() { std::cout << "SubSystemTwo" << std::endl; }

  17. };

  18. //子系统3

  19. class SubSystemThree

  20. {

  21. public:

  22. void MethodThree() { std::cout << "SubSystemThree" << std::endl; }

  23. };

  24. //Facade外观类

  25. class Facade

  26. {

  27. public:

  28. Facade()

  29. {

  30. m_pOne = new SubSystemOne();

  31. m_pTwo = new SubSystemTwo();

  32. m_pThree = new SubSystemThree();

  33. }

  34. void MethodA()

  35. {

  36. m_pOne->MethodOne();

  37. m_pTwo->MethodeTwo();

  38. }

  39. void MethodB()

  40. {

  41. m_pTwo->MethodeTwo();

  42. m_pThree->MethodThree();

  43. }

  44. private:

  45. SubSystemOne *m_pOne;

  46. SubSystemTwo *m_pTwo;

  47. SubSystemThree *m_pThree;

  48. };

  49. int main()

  50. {

  51. Facade *pFacade = new Facade();

  52. pFacade->MethodA();

  53. pFacade->MethodB();

  54. return 0;

  55. }

  56. 当需要为一个复杂子系统提供一个简单、统一的接口时,可以使用Facade模式进行上一层次的封装。比如:在Linux和Window下套接字的socket接口都不一样,所以当我们在进行socket编程时,需要考虑平台的差异性,相当麻烦,而网络库ACE在上一层次上使用Facade外观模式进行封装,提供简单、统一的接口,所以我们在使用ACE进行网络编程时,我们只需要知道ACE提供的统一接口,而不需要去记Linux和Window各种函数及其参数。

  57. 在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多的模式在使用时也都会产生很多很小的类,这本来是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,以减少他们之间的依赖。

  58. 在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能。此时,你可以为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂等遗留代码的清晰、简单接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的功能。

<<Ubuntu下开启ssh服务 Linux下的I/O复用>>

首页 - Wiki
Copyright © 2011-2025 iteam. Current version is 2.148.1. UTC+08:00, 2025-11-24 08:57
浙ICP备14020137号-1 $访客地图$