首页 > 编程 > C++ > 正文

简单了解设计模式中的装饰者模式及C++版代码实现

2020-05-23 14:08:18
字体:大 中 小
来源:转载
供稿:网友

这篇文章主要介绍了简单了解设计模式中的装饰者模式及C++版代码实现,ConcreteComponent的引用(指针)也可以达到修饰的功能,需要的朋友可以参考下

由遇到的问题引出的装饰模式

在 OO 设计和开发过程,可能会经常遇到以下的情况:我们需要为一个已经定义好的类添加新的职责(操作),通常的情况我们会给定义一个新类继承自定义好的类,这样会带来一个问题(将在本模式的讨论中给出)。通过继承的方式解决这样的情况还带来了系统的复杂性,因为继承的深度会变得很深。

而装饰提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合。

有关这些内容在讨论中进一步阐述。

模式选择

装饰模式典型的结构图为:

设计模式,装饰者模式.C++

在 结 构 图 中 , ConcreteComponent 和装饰需 要 有 同 样 的 接 口 , 因 此ConcreteComponent 和装饰有着一个共同的父类。这里有人会问,让装饰直接维护一个指向 ConcreteComponent 引用(指针)不就可以达到同样的效果,答案是肯定并且是否定的。肯定的是你可以通过这种方式实现,否定的是你不要用这种方式实现,因为通过这种方式你就只能为这个特定的 ConcreteComponent 提供修饰操作了,当有了一个新的ConcreteComponent 你 又 要 去 新 建 一 个装饰来 实 现 。 但 是 通 过 结 构 图 中 的ConcreteComponent 和装饰有一个公共基类,就可以利用 OO 中多态的思想来实现只要是 Component 型别的对象都可以提供修饰操作的类,这种情况下你就算新建了 100 个Component 型别的类 ConcreteComponent,也都可以由装饰一个类搞定。这也正是装饰模式的关键和威力所在了。

当然如果你只用给 Component 型别类添加一种修饰,则装饰这个基类就不是很必要了。

实例

  1. #include 
  2.  
  3. using namespace std; 
  4.  
  5. class TestA 
  6.  
  7. { 
  8.  
  9. public: 
  10.  
  11. void display_a() 
  12.  
  13. { 
  14.  
  15. cout<<"display a..."< 
  16.  
  17. } 
  18.  
  19. }; 
  20.  
  21. class TestB 
  22.  
  23. { 
  24.  
  25. public: 
  26.  
  27. void display_b() 
  28.  
  29. { 
  30.  
  31. cout<<"display b..."< 
  32.  
  33. } 
  34.  
  35. }; 
  36.  
  37. class Facade 
  38.  
  39. { 
  40.  
  41. TestA *testa; 
  42.  
  43. TestB *testb; 
  44.  
  45. public: 
  46.  
  47. Facade() 
  48.  
  49. { 
  50.  
  51. testa = new TestA(); 
  52.  
  53. testb = new TestB(); 
  54.  
  55. } 
  56.  
  57. ~Facade() 
  58.  
  59. { 
  60.  
  61. delete testa; 
  62.  
  63. delete testb; 
  64.  
  65. } 
  66.  
  67. void MethodA() 
  68.  
  69. { 
  70.  
  71. testa->display_a(); 
  72.  
  73. testb->display_b(); 
  74.  
  75. } 
  76.  
  77. }; 
  78.  
  79. int main() 
  80.  
  81. { 
  82.  
  83. Facade *facade = new Facade(); 
  84.  
  85. facade->MethodA(); 
  86.  
  87. system("pause"); 
  88.  
  89. return 0; 
  90.  
  91. } 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表