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

【设计模式】装饰模式

时间:2014-05-14 12:03:06      阅读:297      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   c   

 

装饰模式(Decorater)

动态的给一个对象添加一些额外的职责。 就增加功能来说,装饰模式比生成子类更加灵活。

 

装饰模式中有几个关键的地方:

①装饰模式依赖于【装饰者】类中有一个父类对象(指针), 而装饰函数(或方法)用来此父类对象(指针)设置实际的动态类型。

②因为是要给某个对象增加职责,所以很明显的,在继承体系中,需要在某虚函数中调用其父类的该虚函数,这样才有层层调用的效果。

下图来源 http://www.cnblogs.com/god_bless_you/archive/2010/06/10/1755212.html

 

bubuko.com,布布扣

 

好,下面自己想一个例子,有时候我常想:要是人会非该多好啊!

于是幻想有一天有一个白胡子老爷爷(应该是位老神仙)问我:小伙子,现在给你几个技能,你选择一下,会飞会隐身想要钱就来钱想要美女就来美女。这四个你选一个!

可是选哪个好呢?  会飞? 可以在天上飞啊飞的。 会隐身?那能去女澡堂参观吗?(罪过罪过!!) 想要钱就来钱? 光有钱好还少点什么。 想要美女就来美女? 太多了也吃不消啊!

不如这样吧,都来来试试呗,先尝后买嘛!

于是我想四个技能都试试。

 

下面代码中只写了【飞】和【隐身】两个技能的代码

 

超级父类Person类

bubuko.com,布布扣
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

/************************************************************************
设计模式3
装饰模式

用来为某个对象动态的增加操作
这里有两个操作,一个是【飞】,一个是【隐身】
有一个装饰者类【技能】类,通过【技能】类设置(装饰函数)Person类指针的动态
类型,每个继承层次改写Show虚函数,然后两个【飞】【隐身】子类在该Show虚函数
内部调用其父类【技能】类的虚函数,达到层层包装的作用。
************************************************************************/
class Person
{
public: 
    Person(string strName);
    virtual void Show();

protected:
    string m_strName;
};

Person::Person(string strName)
{
    m_strName = strName;
}

void Person::Show()
{
    cout << "\r\n I am "<<m_strName<<", 我就是我,是颜色不一样的烟火 !"<<endl;
}
bubuko.com,布布扣

 

 

【技能】类(装饰者类)

bubuko.com,布布扣
//【技能】类, 装饰器类
class Behavier : public Person
{
protected:
    Person* m_pPerson;

public:
    Behavier(string strName);
    virtual void Show(); 
    virtual void Decorater(Person* pPerson); //装饰函数
};

Behavier::Behavier(string strName) : Person(strName){}

void Behavier::Show()
{
    if (NULL != m_pPerson) m_pPerson->Show();   
}

void Behavier::Decorater(Person* pPerson)
{
    m_pPerson = pPerson;
}
bubuko.com,布布扣

 

 

 

 【飞】类

bubuko.com,布布扣
//【飞】类
class Fly : public Behavier
{
public: 
    Fly(string strName); 
    virtual void Show(); 
};

Fly::Fly(string strName) : Behavier(strName){} 

void Fly::Show()
{
    cout << "\r\n 我会飞啊 哈哈!\r\n";

    Behavier::Show();
}
bubuko.com,布布扣

 

 

 【隐身】类

bubuko.com,布布扣
//【隐身】类
class Hidden : public Behavier
{
public: 
    Hidden(string strName); 
    virtual void Show();
};

Hidden::Hidden(string strName) : Behavier(strName){}
 

void Hidden::Show()
{
    cout << "\r\n 我会隐身!\r\n";
    Behavier::Show();
}
bubuko.com,布布扣

 

 

 

main函数以及执行结果

bubuko.com,布布扣
int _tmain(int argc, _TCHAR* argv[])
{
    //客户端不会出现【技能】类(装饰者类)
    Person *pPerson = new Person("cuish"); 
    Fly *pFly = new Fly("cuish1");
    Hidden *pHidden = new Hidden("cuish2");

    pFly->Decorater(pPerson);
    pHidden->Decorater(pFly);
    pHidden->Show();

    cout << endl <<endl;

    delete pPerson;
    delete pFly;
    delete pHidden;

    return 0;
}
bubuko.com,布布扣

 

 

 bubuko.com,布布扣

 

 

 

 

 

  

 

 

【设计模式】装饰模式,布布扣,bubuko.com

【设计模式】装饰模式

标签:style   blog   class   code   java   c   

原文地址:http://www.cnblogs.com/cuish/p/3726868.html

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