zoukankan      html  css  js  c++  java
  • Decorator 装饰

    意图

    动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

    结构

    Component:定义一个对象接口,可以给这些对象动态地添加职责;(纯虚函数)

    ConcreteComponent:定义一个具体的Component,继承自Component,重写了Component类的虚函数;(继承Component,实现纯虚函数)

    Decorator:维持一个指向Component对象的指针,该指针指向需要被装饰的对象;并定义一个与Component接口一致的接口;(继承Component,提供接口(接口就是那个纯虚函数))

    ConcreteDecorator:向组件添加职责。(添加具体功能)

    实现

     1 #include <iostream>
     2 using namespace std;
     3 class Component
     4 {
     5 public:
     6     virtual void Operation() = 0;
     7 };
     8 class ConcreteComponent : public Component
     9 {
    10 public:
    11     void Operation()
    12     {
    13         cout << "I am no decoratored ConcreteComponent" << endl;
    14     }
    15 };
    16 class Decorator : public Component
    17 {
    18 public:
    19     Decorator(Component *pComponent) : m_pComponentObj(pComponent) {}
    20     void Operation()
    21     {
    22         if (m_pComponentObj != NULL)
    23         {
    24             m_pComponentObj->Operation();
    25         }
    26     }
    27 protected:
    28     Component *m_pComponentObj;
    29 };
    30 class ConcreteDecoratorA : public Decorator
    31 {
    32 public:
    33     ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator){}
    34     void Operation()
    35     {
    36         AddedBehavior();
    37         Decorator::Operation();
    38     }
    39     void  AddedBehavior()
    40     {
    41         cout << "This is added behavior A." << endl;
    42     }
    43 };
    44 class ConcreteDecoratorB : public Decorator
    45 {
    46 public:
    47     ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator){}
    48     void Operation()
    49     {
    50         AddedBehavior();
    51         Decorator::Operation();
    52     }
    53     void  AddedBehavior()
    54     {
    55         cout << "This is added behavior B." << endl;
    56     }
    57 };
    58 int main()
    59 {
    60     Component *pComponentObj = new ConcreteComponent();
    61     Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj);
    62     pDecoratorAOjb->Operation();
    63     cout << "=============================================" << endl;
    64     Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj);
    65     pDecoratorBOjb->Operation();
    66     cout << "=============================================" << endl;
    67     Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb);
    68     pDecoratorBAOjb->Operation();
    69     cout << "=============================================" << endl;
    70     delete pDecoratorBAOjb;
    71     pDecoratorBAOjb = NULL;
    72     delete pDecoratorBOjb;
    73     pDecoratorBOjb = NULL;
    74     delete pDecoratorAOjb;
    75     pDecoratorAOjb = NULL;
    76     delete pComponentObj;
    77     pComponentObj = NULL;
    78 }

    桥接和装饰的区别

    二者都是为了防止过度的继承,从而造成子类泛滥的情况。

    桥接模式的定义是将抽象化与实现化分离(用组合的方式而不是继承的方式),使得两者可以独立变化。可以减少派生类的增长。装饰是在一个核心功能上添加一些附属功能,从而让核心功能发挥更大的作用,但是最终它的核心功能是不能丢失的。

    桥接模式中所说的分离,其实是指将结构与实现分离(当结构和实现有可能发生变化时)或属性与基于属性的行为进行分离;而装饰者只是对基于属性的行为进行封闭成独立的类,从而达到对其进行装饰,也就是扩展。比如:异常类和异常处理类之间就可以使用桥接模式来实现完成,而不能使用装饰模式来进行设计;如果对于异常的处理需要进行扩展时,我们又可以对异常处理类添加Decorator,从而添加处理的装饰,达到异常处理的扩展,这就是一个桥接模式与装饰模式的搭配;

  • 相关阅读:
    17.正则表达式
    16.os模块-shutil模块-tarfile压缩模块
    15.序列化模块-时间模块-zip压缩模块
    第一章 单变量线性回归
    如何跑通MonoRTM模型的官方例子
    PHP命名规范
    js中要声明变量吗?
    php抓取网站图片源码
    InnoDB和MyISAM区别总结
    php分页代码。
  • 原文地址:https://www.cnblogs.com/raichen/p/5764117.html
Copyright © 2011-2022 走看看