程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 設計模式的解析和實現(C++)之九-Decorator模式

設計模式的解析和實現(C++)之九-Decorator模式

編輯:關於C++

作用:

動態地給一個對象添加一些額外的職責。就增加功能來說,Decorator 模式相比生成子類更為靈活。

UML結構圖:

抽象基類:

1)Component:定義一個對象接口,可以為這個接口動態的添加職責.

2)Decorator:維持一個指向Component的指針,並且有一個和Component一致的接口函數.

接口函數:

1)Component::Operation:這個接口函數由Component聲明,因此Component的派生類都需要實現,可以在這個接口函數的基礎上給它動態添加職責.

解析:

Decorator的派生類可以為ConcreateComponent類的對象動態的添加職責,或者可以這麼說:Decorator的派生類裝飾ConcreateComponent類的對象.具體是這麼實現的,首先初始化一個ConcreateComponent類的對象(被裝飾者),采用這個對象去生成一個Decorator對象(裝飾者),之後對Operation函數的調用則是對這個Decorator對象成員函數的多態調用.這裡的實現要點是Decorator類和ConcreateComponent類都繼承自Component,從而兩者的接口函數是一致的;其次,Decorator維護了一個指向Component的指針,從而可以實現對Component::Operation函數的動態調用.

實現:

1)Decorator.h

/**//********************************************************************
    created:    2006/07/20
    filename:     Decorator.h
    author:        李創
                http://www.cppblog.com/converse/

    purpose:    Decorator模式的演示代碼
*********************************************************************/

#ifndef DECORATOR_H
#define DECORATOR_H

// 抽象基類,定義一個對象接口,可以為這個接口動態的添加職責.
class Component
{
public:
    Component(){}
    virtual ~Component(){}

    // 純虛函數,由派生類實現
    virtual void Operation() = 0;
};

// 抽象基類,維護一個指向Component對象的指針
class Decorator
    : public Component
{
public:
    Decorator(Component* pComponent) : m_pComponent(pComponent){}
    virtual ~Decorator();

protected:
    Component* m_pComponent;
};

// 派生自Component,在這裡表示需要給它動態添加職責的類
class ConcreateComponent
    : public Component
{
public:
    ConcreateComponent(){}
    virtual ~ConcreateComponent(){}

    virtual void Operation();
};

// 派生自Decorator,這裡代表為ConcreateComponent動態添加職責的類
class ConcreateDecorator
    : public Decorator
{
public:
    ConcreateDecorator(Component* pComponent) : Decorator(pComponent){}
    virtual ~ConcreateDecorator(){}

    virtual void Operation();

private:
    void AddedBehavior();
};

#endif

2)Decorator.cpp

/**//********************************************************************
    created:    2006/07/20
    filename:     Decorator.cpp
    author:        李創
                http://www.cppblog.com/converse/

    purpose:    Decorator模式的演示代碼
*********************************************************************/

#include "Decorator.h"
#include <iostream>

Decorator::~Decorator()
{
    delete m_pComponent;
    m_pComponent = NULL;
}

void ConcreateComponent::Operation()
{
    std::cout << "Operation of ConcreateComponent\n";
}

void ConcreateDecorator::Operation()
{
    m_pComponent->Operation();
    AddedBehavior();
}

void ConcreateDecorator::AddedBehavior()
{
    std::cout << "AddedBehavior of ConcreateDecorator\n";
}

3)Main.cpp

/**//********************************************************************
    created:    2006/07/20
    filename:     Main.cpp
    author:        李創
                http://www.cppblog.com/converse/

    purpose:    Decorator模式的測試代碼
*********************************************************************/

#include "Decorator.h"
#include <stdlib.h>

int main()
{
    // 初始化一個Component對象
    Component* pComponent = new ConcreateComponent();
    // 采用這個Component對象去初始化一個Decorator對象,
    // 這樣就可以為這個Component對象動態添加職責
    Decorator* pDecorator = new ConcreateDecorator(pComponent);

    pDecorator->Operation();

    delete pDecorator;

    system("pause");

    return 0;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved