C++设计模式(一)装饰者
来源:互联网 发布:java做贪吃蛇游戏 编辑:程序博客网 时间:2024/04/30 15:38
一、引入
当我们想要扩展类的功能的时候,很多情况下会考虑用继承的方法,比如我们的以前的手机类,只支持打电话,发短信,如果我们想要扩展手机的功能,让普通的手机变成智能手机,那最简单的方式就是新建一个智能手机类并继承手机类,扩充智能手机拥有的新功能,比如打游戏,上网。
但是子类继承的方法总归不是非常灵活啊,为了更好的解决类功能扩展的问题,我们来引用今天要学习的新模式——装饰模式。首先先看一下标准定义。
装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活。
从这个定义中可以找到几个要点:
1.动态的扩展
2.不会改变原有类
3.不用生成子类的继承方式
在这个模式中主要有四个类
1.原始类接口(接口类型或者抽象类)
2.原始类的具体实现类
3.装饰器接口(一般类或抽象类)
4.继承了装饰器接口的一系列具体装饰器
UML类图
代码描述
1.原始类接口(接口类型或者抽象类)
class Phone
{
public:
Phone();
virtual~Phone();
virtual void Call();
virtual void SendMsg(); // 虚函数或者纯虚函数
};
2.原始类的具体实现类
class IPhone : public Phone
{
public:
IPhone();
virtual ~IPhone();
virtual void Call();
virtual void SendMsg();
};
3.装饰器接口(一般类或抽象类)
class PhoneDecorator : public Phone
{
public:
PhoneDecorator(Phone* phone);
virtual ~PhoneDecorator();
Phone *m_Phone;
virtual void Call();
virtual void SendMsg();
private:
m_pPhone * m_pPhone;
};
4.继承了装饰器接口的一系列的具体装饰器
class ConcreteDecorator :public PhoneDecorator
{
public:
ConcreteDecorator(Phone *phone);
virtual ~ConcreteDecorator();
virtual void Call(); // 在函数里调用父类的Call,然后调ChangeVoice
void ChangeVoice(); // 增加变声功能
virtual void SendMsg();
};
5.测试
void main()
{
Phone *iphone = new IPhone(); // iphone手机
Phone *bsiphone = new ConcreteDecorator(iphone); // iphone增加变声功能
delete iphone;
delete bsiphone;
}
四、总结
装饰模式是一个为已有功能的类动态添加更多功能的一种方式,各个功能的扩展相互独立,可以根据需要随意组合,但组合的顺序有先后。
优点:
1.有效避免了继承方式对扩展对象功能带来的灵活性差的问题
2.通过组合而非继承的方式,实现了动态扩展对象的功能的能力
3.符合高内聚、低耦合的设计思想
缺点:
1.装饰链不能过长,否则影响效率
2.原始类接口不能改变,因为所有装饰器基类继承于原始类接口,类接口变化会导致所有装饰器的修改
- C++设计模式(一)装饰者
- 设计模式一日一练:装饰者模式(Decorator)
- 设计模式之装饰者模式(一)
- 设计模式之装饰者模式(一)
- (C++)设计模式------装饰者模式 decorator
- 设计模式——装饰者模式(c++)
- 设计模式——装饰者模式(C++)
- C#--设计模式之装饰者模式
- 设计模式(一)——装饰设计模式
- 装饰者模式(C++)
- 装饰者模式(C++)
- 设计模式:装饰者模式(Python)
- 设计模式(装饰者模式)
- 设计模式(装饰者模式)
- 【设计模式】-装饰者模式(Wrapper)
- 设计模式:9)装饰者模式
- 设计模式(二)装饰者模式
- 设计模式-装饰者模式(6)
- java jxl读取excel中的数据传入二维数组中
- Java中的字符串常量池详解--转载自技术小黑屋
- Android资源--颜色
- Web前端性能优化之浏览器访问优化
- C++中的标准函数对象
- C++设计模式(一)装饰者
- 1-1 欢迎来的C++世界
- Web前端性能优化之CDN加速
- jquery validate (jquery 验证的三种方式)
- Linux学习---搜索命令
- 算法系列—快速排序及其优化(递归)
- js gbk与UTF8 转换
- Web前端性能优化之反向代理
- *[Lintcode]Longest Increasing Subsequence 最长上升子序列