首页 > 代码库 > 设计模式实现C++ --装饰模式Decorator Pattern

设计模式实现C++ --装饰模式Decorator Pattern

定义:动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

类图:

  Component:定义一个对接接口,可以给这些对象动态的添加职责;

  ConcreteComponent:定义一个具体的对象,也可以给对象添加一些职责;

  Decorator:装饰抽象类,继承了Component,从外类来扩展Component类的功能,对于Component来说无需知道Decorator的存在;

  ConcreteDecorator:具体的装饰对象,起到给Component添加职责的功能;

 

  装饰者和被装饰者之间必须是一样的类型,也就是要有共同的超类。在这里应用继承并不是实现方法的复制,而是实现类型的匹配。因为装饰者和被装饰者是同一个类型,因此装饰者可以取代被装饰者,这样就使被装饰者拥有了装饰者独有的行为。根据装饰者模式的理念,我们可以在任何时候,实现新的装饰者增加新的行为。如果是用继承,每当需要增加新的行为时,就要修改原程序了。

实例:在展示新闻的同时给读取出来的新闻的人气加一,同时把新闻标题加入到RSS中,如果是用继承,就要往超类中增加相应的方法,如果是一个新增行为还是可以忍受的,如果此模块有不断增加业务的可能,那是不是要每次都要修改原程序呢?我想所有的朋友都不希望这样做。我们希望当有新的行为时才往旧对象上加,是在运行时加,并不是一开始就加。

  

//#ifdef COMPONENT_NEW_H//#define COMPONENT_NEW_H#include <iostream>#include <string>using namespace std;class Component_New{public:        virtual void getNew() = 0;};class DB_New:public Component_New{public:        void getNew()        {                cout << "从数据库取得数据" << endl;        }};class XML_New: public Component_New{public:        void getNew()        {                cout << "从XML取得数据" << endl;        }};class Decorator_New:public Component_New{public:        Decorator_New(Component_New& componentnew)        {                _Component_New = &componentnew;        }        void getNew()        {                _Component_New->getNew();        }private:        Component_New* _Component_New;};class ConcreteDecorator_AddAmount:public Decorator_New{public:        ConcreteDecorator_AddAmount(Component_New& componentnew)                :Decorator_New::Decorator_New(componentnew)        {//              Decorator_New::Decorator_New(&componentnew);        }        void AddAmount()        {                cout << "新闻人气已经加一" << endl;        }        void getNew()        {                AddAmount();                Decorator_New::getNew();        }};class ConcreteDecorator_AddRss:public Decorator_New{public:        ConcreteDecorator_AddRss(Component_New& componentnew)                :Decorator_New::Decorator_New(componentnew)        {}        void AddRss()        {                cout << "新闻标题已经加入到RSS中" << endl;        }        void getNew()        {                AddRss();                Decorator_New::getNew();        }};
#include <iostream>#include "Component_News.h"int main(){        Component_New* _Component_New = new DB_New();        Decorator_New* _Decorator_New = new ConcreteDecorator_AddAmount(*_Component_New);        _Decorator_New = new ConcreteDecorator_AddRss(*_Decorator_New);        _Decorator_New->getNew();        return 0;}

 

优点:

  1)把类中装饰功能从类中搬移去除,这样可以简化原有的类;

  2)有效地把类的核心功能区分开,去除类中重复的装饰逻辑;

设计模式实现C++ --装饰模式Decorator Pattern