设计模式实现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)有效地把类的核心功能区分开,去除类中重复的装饰逻辑;

posted @ 2014-08-24 18:17  AngelAI  阅读(829)  评论(0编辑  收藏  举报