设计模式学习-每日一记(9.装饰者模式)
2011-10-28 17:16
232 查看
装饰者模式
A.定义:
动态地给一个对象添加一些职责。就增加功能而言,装饰者模式比生成子类更灵活。
B.定义分析:
"动态地给一个对象添加一些职责。就增加功能而言,装饰者模式比生成子类更灵活。"我们知道,对象的职责定义在类中,类的方法决定了对象的职责.
"动态地给一个对象添加一些职责。就增加功能而言,装饰者模式比生成子类更灵活。"装饰者模式的意图是不修改类,而是动态给对象添加职责.
"动态地给一个对象添加一些职责。就增加功能而言,装饰者模式比生成子类更灵活。"装饰者不修改类,而是动态给对象加,当然灵活.
C.问题:
(1)怎么实现?
假设有类A和SubA,SubA继承自A.A有个接口dress表示穿衣服.
但是,我们突然间想要扩展下dress这个接口,但是有不想改变A和SubA。这时候,我们使用装饰模式:
其中的DecoratorHat和DecoratorGlass就是装饰者,用法可以是:
这时候,SubA就被装饰咯.
A.定义:
动态地给一个对象添加一些职责。就增加功能而言,装饰者模式比生成子类更灵活。
B.定义分析:
"动态地给一个对象添加一些职责。就增加功能而言,装饰者模式比生成子类更灵活。"我们知道,对象的职责定义在类中,类的方法决定了对象的职责.
"动态地给一个对象添加一些职责。就增加功能而言,装饰者模式比生成子类更灵活。"装饰者模式的意图是不修改类,而是动态给对象添加职责.
"动态地给一个对象添加一些职责。就增加功能而言,装饰者模式比生成子类更灵活。"装饰者不修改类,而是动态给对象加,当然灵活.
C.问题:
(1)怎么实现?
假设有类A和SubA,SubA继承自A.A有个接口dress表示穿衣服.
class A { virtual void dress(void) = 0; }; class SubA : public A { void dress(void) { //穿T恤. } };
但是,我们突然间想要扩展下dress这个接口,但是有不想改变A和SubA。这时候,我们使用装饰模式:
class DecoratorHat : public A { A* m_p; DecoratorHat(A* p) :A() { m_p = p; } void dress(void) { //戴帽子 m_p->dress(); } }; class DecoratorGlass : public A { A* m_p; DecoratorGlass(A* p) :A() { m_p = p; } void dress(void) { //戴眼镜 m_p->dress(); } };
其中的DecoratorHat和DecoratorGlass就是装饰者,用法可以是:
A* p = NULL; p = new DecoratorHat(new DecoratorGlass(new SubA)); p->dress();
这时候,SubA就被装饰咯.
相关文章推荐
- 设计模式学习-每日一记(10.组合模式)
- 设计模式学习-每日一记(22.访问者模式)
- 设计模式学习-每日一记(11.代理模式)
- 设计模式学习-每日一记(19.备忘录模式)
- 设计模式学习-每日一记(12.轻量模式)
- 设计模式学习-每日一记(4.抽象工厂)
- 设计模式学习-每日一记(23.责任链模式)
- 设计模式学习-每日一记(5.创建者模式)
- 设计模式学习-每日一记(7.适配器模式)
- 设计模式学习-每日一记(17.解释器模式)
- 设计模式学习-每日一记(6.原型模式)
- 设计模式学习-每日一记(18.命令模式)
- 设计模式学习-每日一记(8.桥接模式)
- 设计模式学习-每日一记(20.中介者模式)
- 设计模式学习-每日一记(13.策略模式)
- 设计模式学习-每日一记(14.观察者模式)
- 设计模式学习-每日一记(21.叠代器模式)
- 设计模式学习-每日一记(15.状态模式)
- 设计模式学习-每日一记(1.简单工厂模式)
- 设计模式学习-每日一记(2.外观模式)