Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1887305
  • 博文数量: 496
  • 博客积分: 12043
  • 博客等级: 上将
  • 技术积分: 4778
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-27 14:26
文章分类

全部博文(496)

文章存档

2014年(8)

2013年(4)

2012年(181)

2011年(303)

2010年(3)

分类: C/C++

2012-06-02 13:52:47

装饰模式
       动态地给一个对象添加一些额外的职责(不重要的功能,只是偶然一次要执行),就增加功能来说,装饰模式比生成子类更为灵活。建造过程不稳定,按正确的顺序串联起来进行控制。

优点:当你向旧的类中添加新代码时,一般是为了添加核心职责或主要行为。而当需要加入的仅仅是一些特定情况下才会执行的特定的功能时(简单点就是不是核心应用的功能),就会增加类的复杂度。装饰模式就是把要添加的附加功能分别放在单独的类中,并让这个类包含它要装饰的对象,当需要执行时,客户端就可以有选择地、按顺序地使用装饰功能包装对象。

下面是代码:
#include
#include

using namespace std;

//人
class Person
{
public:
    string m_strName;
public:
    Person(string strName)
    {
         m_strName = strName;
    }
    Person(){}
   
    virtual void Show()
    {
         cout << "装扮的是: " << m_strName << endl;
    }
};

//装饰类
class Finery : public Person
{
protected:
    Person* m_component;
public:
    void Decorate(Person* component)
    {
        m_component = component;
    }
    virtual void Show()
    {
        m_component->Show();
    }
};

//T恤
class TShirts : public Finery
{
public:
    virtual void Show()
    {
         cout << "T Shirts" << endl;
         m_component->Show();
    }
};

//裤子
class BigTrouser : public Finery
{
public:
    virtual void Show()
    {
         cout << "Big Trouser" << endl;
         m_component->Show();
    }
};

//客户端
int main()
{
    Person* p = new Person("小李");
    BigTrouser *bt = new BigTrouser();
    TShirts* ts = new TShirts();
   
    bt->Decorate(p);
    ts->Decorate(bt);
    ts->Show();
   
    return 0;
}


阅读(621) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~