大胖的部落格

Just a note

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  112 随笔 :: 0 文章 :: 3 评论 :: 0 Trackbacks
当想针对某个子类对象添加新功能时,可以不采用继续继承该子类产生新的派生类的方法。
Decorator更加灵活地动态扩展目标子类。
从基类新派生的Decorator类保存了基类类型的指针,重写了需要扩展功能的函数。
Decorator类对象构造时传入基类类型指针(实际指向目标子类),这样内部可以调用目标子类的方法,重写时调用目标子类方法,并加入新的操作。
Decorator对象就可以取代目标子类对象,可以调用原来的操作,还加入了新的操作,且类型都为基类类型。

#include <iostream>

using namespace std;


//抽象基类
class Component
{
public:
    
virtual void Operation() = 0;
}
;

//具体子类
class ConcreteComponent: public Component
{
public:
    
void Operation()
    
{
        cout
<<"My operation"<<endl;
    }

}
;

//Decorator基类,传入Component类型指针,重写Operation方法
class Decorator: public Component
{
public:
    Decorator(Component
* p):pc(p){}
    
//调用传入Component类型对象的方法
    void Operation()
    
{
        pc
->Operation();
    }

private:
    Component
* pc;
}
;

//Decorator子类
class ConcreteDecorator: public Decorator
{
public:
    ConcreteDecorator(Component
* p):Decorator(p){}
    
//重写Operation,加入自己的操作
    void Operation()
    
{
        Decorator::Operation();
        
this->AddedOperation();
    }

private:
    
//添加的操作
    void AddedOperation(){cout<<"Added Operation"<<endl;}
}
;

int main()
{
    
//添加Decorator之前的Operation
    Component* pc = new ConcreteComponent;
    pc
->Operation();
    
//添加了新操作之后的Operation
    Component* pd = new ConcreteDecorator(pc);
    pd
->Operation();

    delete pd;
    delete pc;
    
return 0;
}
posted on 2009-06-09 15:56 大胖 阅读(154) 评论(0)  编辑 收藏 引用 所属分类: Design Pattern

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理