《大话设计模式》读书笔记之C++实现--chapter6装饰模式
2017-03-30 20:42
429 查看
1、UML类图
2、UML类图详解
装饰模式的结构主要有四个元素:
--抽象组件:Component
--具体组件:ConcreteComponent
--抽象装饰组件:Decorator
--具体装饰组件:ConcreteDecorator
装饰模式的三个主要特点为:
--具体组件和装饰组件都继承于抽象组件
--装饰组件有抽象组件的指针或引用(Component*)
--使用装饰组件和具体组件可以创造出新的类
3、使用场合
为已有功能动态添加更多功能的一种方式,当加入的新功能仅仅是为了满足一些只在某种特定情况才会执行的特殊行为的需要,但在原类中加入新代码会增加原类的复杂度。装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装他所需要修饰的对象,因此当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用修饰功能包装对象。有效地把类的核心职责和装饰功能分开了,而且可以去除类中重复的装饰逻辑。
用形象话的语言理解装饰模式就是把抽象组件看成一个人类,具体组件可以是小明,现在我想为小明穿上衬衣,西服,皮鞋,领带...可扩展的类,但是核心的人类保持不变,体现了依赖倒置原则--即对内“封闭”,对外“开放”。装饰模式一般用在核心功能保持不变但是装饰功能可以动态的增加或者选择性地调用。以下示例程序的执行结构如图:
4、C+代码实现
2、UML类图详解
装饰模式的结构主要有四个元素:
--抽象组件:Component
--具体组件:ConcreteComponent
--抽象装饰组件:Decorator
--具体装饰组件:ConcreteDecorator
装饰模式的三个主要特点为:
--具体组件和装饰组件都继承于抽象组件
--装饰组件有抽象组件的指针或引用(Component*)
--使用装饰组件和具体组件可以创造出新的类
3、使用场合
为已有功能动态添加更多功能的一种方式,当加入的新功能仅仅是为了满足一些只在某种特定情况才会执行的特殊行为的需要,但在原类中加入新代码会增加原类的复杂度。装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装他所需要修饰的对象,因此当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用修饰功能包装对象。有效地把类的核心职责和装饰功能分开了,而且可以去除类中重复的装饰逻辑。
用形象话的语言理解装饰模式就是把抽象组件看成一个人类,具体组件可以是小明,现在我想为小明穿上衬衣,西服,皮鞋,领带...可扩展的类,但是核心的人类保持不变,体现了依赖倒置原则--即对内“封闭”,对外“开放”。装饰模式一般用在核心功能保持不变但是装饰功能可以动态的增加或者选择性地调用。以下示例程序的执行结构如图:
4、C+代码实现
#include<iostream> #include<string> using namespace std; //根据UML类图创建的装饰模式的类 class Component { public: virtual void operation() = 0; }; class ConcreteComponent :public Component { public: virtual void operation() { cout << "I'm no decorator ConcreteComponent" << endl; } }; class Decorator :public Component { public: Decorator(Component* pComponent) :m_pComponent(pComponent) {} virtual void operation() { if (m_pComponent != NULL) m_pComponent->operation(); } protected: Component* m_pComponent; }; class ConcreteDecoratorA :public Decorator { public: ConcreteDecoratorA(Component *pDecorator) : Decorator(pDecorator) {} virtual void operation() { Addoperation(); Decorator::operation(); } void Addoperation() { cout << "I'm add operationA" << endl; } }; class ConcreteDecoratorB :public Decorator { public: ConcreteDecoratorB(Component *pDecorator) : Decorator(pDecorator) {} virtual void operation() { Addoperation(); Decorator::operation(); } void Addoperation() { cout << "I'm add operationB" << endl; } }; //主程序 int main() { Component *pComponentObj = new ConcreteComponent(); Decorator *pDecoratorAOjb = new ConcreteDecoratorA(pComponentObj); pDecoratorAOjb->operation(); cout << "=============================================" << endl; Decorator *pDecoratorBOjb = new ConcreteDecoratorB(pComponentObj); pDecoratorBOjb->operation(); cout << "=============================================" << endl; Decorator *pDecoratorBAOjb = new ConcreteDecoratorB(pDecoratorAOjb); pDecoratorBAOjb->operation(); cout << "=============================================" << endl; delete pDecoratorBAOjb; pDecoratorBAOjb = NULL; delete pDecoratorBOjb; pDecoratorBOjb = NULL; delete pDecoratorAOjb; pDecoratorAOjb = NULL; delete pComponentObj; pComponentObj = NULL; system("pause"); return 0; }
相关文章推荐
- 《大话设计模式》读书笔记之C++实现--chapter7代理模式
- 《大话设计模式》读书笔记之C++实现--chapter15抽象工厂模式
- 《大话设计模式》读书笔记之C++实现--chapter8工厂方法模式
- 《大话设计模式》读书笔记之C++实现--chapter23命令模式
- 《大话设计模式》读书笔记(C++代码实现) 第二章:策略模式
- 《大话设计模式》读书笔记(C++代码实现) 第一章:简单工厂模式
- 《大话设计模式》读书笔记(C++代码实现) 第二章:策略模式
- 《大话设计模式》读书笔记之C++实现--chapter24命令模式
- 《大话设计模式》读书笔记(C++代码实现) 第七章:代理模式
- 《大话设计模式》读书笔记(C++代码实现) 第七章:代理模式
- 《大话设计模式》读书笔记之C++实现--chapter27解释器模式
- 《大话设计模式》读书笔记(C++代码实现) 第六章:装饰模式
- 《大话设计模式》读书笔记(C++代码实现) 第六章:装饰模式
- 《大话设计模式》读书笔记之C++实现--chapter1运算工厂类(简单计算器)
- 《大话设计模式》读书笔记之C++实现--chapter2策略模式(商场收费系统)
- 《大话设计模式》读书笔记之C++实现--chapter22桥接模式
- 《大话设计模式》读书笔记(C++代码实现) 第一章:简单工厂模式
- 大话设计模式--策略模式 strategy -- C++实现实例
- 大话设计模式--原型模式 Prototype -- C++实现
- 大话设计模式--装饰者模式 Decorator -- C++实现实例