您的位置:首页 > 编程语言 > C语言/C++

着装展示之装饰模式学习笔记[C++版]

2009-12-02 18:41 459 查看
/************************************************************************
* 装饰模式学习笔记[C++]
* Author:  陈相礼
* Time:    2009.12.02
* Compiler: VC8
************************************************************************/
#include "DecoratePattern.h"
#include "DecoratePattern1.h"
#include <iostream>
using namespace std;
int main()
{
//------------------装饰模式原理类测试-------------------
CConcreteComponent *cc = new CConcreteComponent();
CConcreteDecoratorA *ca = new CConcreteDecoratorA();
CConcreteDecoratorB *cb = new CConcreteDecoratorB();
ca->vSetComponent( cc );
cb->vSetComponent( ca );
cb->vOperation();
delete(cc);
delete(ca);
delete(cb);
//------------------换装类测试-------------------
CPerson *cp = new CPerson( "Rainleaf" );
cout << "第一种装束:" << endl;
// 获取装束
CSneakers *csk = new CSneakers();
CTShirts *cts = new CTShirts();
CBigTrouser *cbt = new CBigTrouser();
// 开始装束
csk->vDecorate( cp );
cts->vDecorate( csk );
cbt->vDecorate( cts );
// 展示
cbt->vShow();
delete(csk);
delete(cts);
delete(cbt);
cout << "第二种装束:" << endl;
// 获取装束
CLeatherShoes *cls = new CLeatherShoes();
CTie *ct = new CTie();
CSuit *cst = new CSuit();
// 开始装束
cls->vDecorate( cp );
ct->vDecorate( cls );
cst->vDecorate( ct );
// 展示
cst->vShow();
delete(cls);
delete(ct);
delete(cst);
return 0;
}
/************************************************************************
* 总结:
*   1、装饰模式是为已有功能动态地添加更多功能的一种方式。
*   2、当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的
*      代码通常装饰了原有类的核心职责或主要行为。
*   3、在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的
*      复杂度,而这些新加入的东西仅仅是为了满足一些只是在某种情况下
*      才会执行的特殊行为的需要。装饰模式却提供了一个非常好的解决方
*      案,它把每个要装饰的功能在单独的类中,并让这个类包装它所要装
*      饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时
*      根据需要有选择地、按顺序地使用装饰功能包装对象。
*   4、装饰模式优点:有效地把类的核心职责和装饰功能区分开了。而且可
*      以去除相关类中重复装饰的逻辑。
************************************************************************/


#pragma once
/**********************************************
* 装饰模式原理:
*      动态给一个对象添加一些额外的职责,就
*   增加功能来说,装饰模式比生成子类给为灵活。
***********************************************/
#include <iostream>
using namespace std;
//---------------------------------------------
// 对象接口类
//      定义一个对象接口,可以给这些对象动态
//  地添加职责。
class CComponent
{
public:
virtual void vOperation() {};
};
//---------------------------------------------
// 具体对象类
//      定义一个具体对象,也可以给这些对象添
// 加职责。
class CConcreteComponent : public CComponent
{
public:
void vOperation()
{
cout << "具体对象的操作" << endl;
}
};
//---------------------------------------------
// 装饰抽象类
//      从外类来扩展CComponent类的功能,但
//  CComponent类无需知道CDecorator类的存在。
class CDecorator : public CComponent
{
public:
void vSetComponent( CComponent *pcompt )
{// 设置成员变量component
pcomponent = pcompt;
}
// 重写vOperation(),实际执行父类中的vOperation()
virtual void vOperation()
{
if ( NULL != pcomponent )
{
pcomponent->vOperation();
}
}
protected:
CComponent *pcomponent;
};
class CConcreteDecoratorA : public CDecorator
{
public:
void vOperation()
{
CDecorator::vOperation();
dwAddedState = 100;
cout << "具体装饰对象A的操作" << endl;
}
private:
// 本类独有功能,以示区<mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script>别
double dwAddedState;
};
class CConcreteDecoratorB : public CDecorator
{
public:
void vOperation()
{
CDecorator::vOperation();
vAddedBehavior();
cout << "具体装饰对象B的操作" << endl;
}
private:
// 本类独有功能,以示区别
void vAddedBehavior()
{
cout << "具体装饰对象B独有的方法" << endl;
}
};


#pragma once
/********************************
*
* 装饰模式应用:形象展示
*
********************************/
#include <iostream>
#include <string>
using namespace std;
// CPerson类(CConcreteComponent)
class CPerson
{
public:
CPerson() : strName(""){};
CPerson( string name ) : strName(name){};
virtual void vShow()
{
cout << "装扮的" << strName << endl;
}
protected:
private:
string strName;
};
// 服饰类(CDecorator)
class CFinery : public CPerson
{
public:
// 打扮
void vDecorate( CPerson *pcompt )
{
pcomponent = pcompt;
}
// 展示
void vShow()
{
if ( NULL != pcomponent )
{
pcomponent->vShow();
}
}
protected:
CPerson *pcomponent;
private:
};
// 具体服饰类(CConcreteDecorator)
class CTShirts : public CFinery
{
public:
void vShow()
{
cout << "大T恤!" << endl;
CFinery::vShow();
}
protected:
private:
};
class CBigTrouser : public CFinery
{
public:
void vShow()
{
cout << "跨裤!" << endl;
CFinery::vShow();
}
protected:
private:
};
class CSneakers : public CFinery
{
public:
void vShow()
{
cout << "耐克!" << endl;
CFinery::vShow();
}
protected:
private:
};
class CLeatherShoes : public CFinery
{
public:
void vShow()
{
cout << "长靴!" << endl;
CFinery::vShow();
}
protected:
private:
};
class CTie : public CFinery
{
public:
void vShow()
{
cout << "领带!" << endl;
CFinery::vShow();
}
protected:
private:
};
class CSuit : public CFinery
{
public:
void vShow()
{
cout << "西服!" << endl;
CFinery::vShow();
}
protected:
private:
};


——By 陈相礼 09/12/02
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: