源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

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

  • 时间:2022-01-09 19:10 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:简单了解设计模式中的装饰者模式及C++版代码实现
[b]由遇到的问题引出的装饰模式[/b] 在 OO 设计和开发过程,可能会经常遇到以下的情况:我们需要为一个已经定义好的类添加新的职责(操作),通常的情况我们会给定义一个新类继承自定义好的类,这样会带来一个问题(将在本模式的讨论中给出)。通过继承的方式解决这样的情况还带来了系统的复杂性,因为继承的深度会变得很深。 而装饰提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合。 有关这些内容在讨论中进一步阐述。 [b]模式选择 [/b]装饰模式典型的结构图为: [img]http://files.jb51.net/file_images/article/201603/201639103245900.jpg?20162910330[/img] 在 结 构 图 中 , ConcreteComponent 和装饰需 要 有 同 样 的 接 口 , 因 此ConcreteComponent 和装饰有着一个共同的父类。这里有人会问,让装饰直接维护一个指向 ConcreteComponent 引用(指针)不就可以达到同样的效果,答案是肯定并且是否定的。肯定的是你可以通过这种方式实现,否定的是你不要用这种方式实现,因为通过这种方式你就只能为这个特定的 ConcreteComponent 提供修饰操作了,当有了一个新的ConcreteComponent 你 又 要 去 新 建 一 个装饰来 实 现 。 但 是 通 过 结 构 图 中 的ConcreteComponent 和装饰有一个公共基类,就可以利用 OO 中多态的思想来实现只要是 Component 型别的对象都可以提供修饰操作的类,这种情况下你就算新建了 100 个Component 型别的类 ConcreteComponent,也都可以由装饰一个类搞定。这也正是装饰模式的关键和威力所在了。 当然如果你只用给 Component 型别类添加一种修饰,则装饰这个基类就不是很必要了。 [b]实例[/b]
#include <iostream> 
using namespace std; 
 
class TestA 
{ 
public: 
  void display_a() 
  { 
    cout<<"display a..."<<endl; 
  } 
}; 
 
class TestB 
{ 
public: 
  void display_b() 
  { 
    cout<<"display b..."<<endl; 
  } 
}; 
 
class Facade 
{ 
  TestA *testa; 
  TestB *testb; 
 
public: 
  Facade() 
  { 
    testa = new TestA(); 
    testb = new TestB(); 
  } 
  ~Facade() 
  { 
    delete testa; 
    delete testb; 
  } 
 
  void MethodA() 
  { 
    testa->display_a(); 
    testb->display_b(); 
  } 
}; 
 
int main() 
{ 
  Facade *facade = new Facade(); 
   
  facade->MethodA(); 
 
  system("pause"); 
  return 0; 
} 
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部