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

所属分类: 软件编程 / C 语言 阅读数: 71
收藏 0 赞 0 分享

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

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

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

有关这些内容在讨论中进一步阐述。
模式选择
装饰模式典型的结构图为:

201639103245900.jpg (557×364)

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

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

实例

#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; 
} 

更多精彩内容其他人还在看

C++中四种对象生存期和作用域以及static的用法总结分析

以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++嵌套类与局部类详细解析

从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定
收藏 0 赞 0 分享

C++空类详解

以下是对C++中的空类进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
收藏 0 赞 0 分享

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
收藏 0 赞 0 分享

C数据结构之单链表详细示例分析

以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C数据结构之双链表详细示例分析

以下是对c语言中的双链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅析如何在c语言中调用Linux脚本

如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
收藏 0 赞 0 分享

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅谈C++中的string 类型占几个字节

本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节
收藏 0 赞 0 分享
查看更多