码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式学习-装饰模式

时间:2015-05-11 23:58:40      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:

1.什么是装饰模式

  装饰模式,在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。动态地给一个对象添加一些额外的职责。这样是能够把类中的装饰功能从类中搬移出去,这样可以简化原有的类。有效地把类的核心功能和装饰功能区分开了。

2.装饰模式的实现

  在本例子中,举例最常见的人穿衣服的例子,首先我们定义这样一个Person的基类,如下:

#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
class Person
{
public:
    Person(){}
    Person(string n)
    {
        name = n;
    }
    virtual void show()    = 0;
private:
    string name;
};

  在基类下,有着不同种类的人,我们就定义男人这样一个子类如下:

class Men:public Person
{
public:
    Men(string n):name(n){};
    virtual void show()
    {
        cout<<name<<"  de zhuang shi"<<endl;
    }
private:
    string name;
};

  下面我们就要用到一个装饰类,如装饰一个人,我们对装饰类定义如下:

class Finery:public Person
{
public:
    Finery(Person *c)
    {
        component = c;
    }
     virtual void show() 
     {
         component->show(); 
     }  
protected:
    Person *component;
};

  在装饰的类下,我们可以定义一个一个的装饰细节,比如我们定义一个Tshirt的类和一个Cap的类:

class Tshirts:public Finery
{
public:
    Tshirts(Person *p):Finery(p)
    {}
    void show()
    {
        component->show();
        add();
    }    
    void add()
    {
        cout<<"add Tshirts"<<endl;
    }
};
class Cap:public Finery
{
public:
    Cap(Person *p):Finery(p)
    {}
    void show()
    {
        component->show();
        add();
    }    
    void add()
    {
        cout<<"add Cap"<<endl;
    }
};

  在客户端中,我们通过调用

    Person *man = new Men("wq");
    Person *dpa = new Tshirts(man);
    Person *dpb = new Cap(dpa);
    dpb->show(); 

就可以装饰我们实例化的那个人的对象,从这里我们可以看出,首先我们实例化一个叫做wq的对象,然后我们在这个对象之上,实例化一个Tshirt,但是仍然使用基类的指针,同理Cap的实例化过程也是这样的,当我们调用dpb的时候,实际上我们调用的装饰好的对象。

设计模式学习-装饰模式

标签:

原文地址:http://www.cnblogs.com/MPoooooo/p/4495898.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!