结构性模式:装饰模式
2015-09-20 11:26
316 查看
意图:动态地给一个对象添加一些额外的职责。
抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
具体装饰(Concrete Decorator)角色:负责给构件对象"贴上"附加的责任。
就我个人的理解,本质上其实是将当前类的职能分割,某些职能封装到其他的类去实现,当前类维护一个职能类的对象。
装饰模式C++实现
Decorator.h
Decorator.cpp
Main.cpp
抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
具体装饰(Concrete Decorator)角色:负责给构件对象"贴上"附加的责任。
就我个人的理解,本质上其实是将当前类的职能分割,某些职能封装到其他的类去实现,当前类维护一个职能类的对象。
装饰模式C++实现
Decorator.h
#ifndef DECORATOR_H #define DECORATOR_H // 抽象基类,定义一个对象接口,可以为这个接口动态的添加职责 class Component { public: Component(){} virtual ~Component(){} virtual void Operation() = 0; // 纯虚函数,由派生类实现 }; // 抽象基类,维护一个指向Component对象的指针 class Decorator : public Component { public: Decorator(Component* pComponent) : m_pComponent(pComponent){} virtual ~Decorator(); protected: Component* m_pComponent; //这个就是用来装饰的对象</span> }; // 派生自Component,在这里表示需要给它动态添加职责的类 class ConcreateComponent : public Component { public: ConcreateComponent(){} virtual ~ConcreateComponent(){} virtual void Operation(); }; // 派生自Decorator,这里代表为ConcreateComponent动态添加职责的类 class ConcreateDecorator : public Decorator { public: ConcreateDecorator(Component* pComponent) : Decorator(pComponent){} virtual ~ConcreateDecorator(){} virtual void Operation(); private: void AddedBehavior(); }; #endif
Decorator.cpp
#include "Decorator.h" void ConcreateComponent::Operation() { std::cout << "Operation of ConcreateComponentn"; } void ConcreateDecorator::Operation() { m_pComponent->Operation(); AddedBehavior(); } void ConcreateDecorator::AddedBehavior() { std::cout << "AddedBehavior of ConcreateDecoratorn"; }
Main.cpp
void main() { // 初始化一个Component对象 Component* pComponent = new ConcreateComponent(); // 采用这个Component对象去初始化一个Decorator对象,这样就可以为这个Component对象动态添加职责 Decorator* pDecorator = new ConcreateDecorator(pComponent); pDecorator->Operation(); delete pDecorator; }
相关文章推荐
- JDBC
- 状态控制 VS 流程控制
- iOS:文件归档和解归档的详解和使用
- git
- 仿微信聊天界面小项目总结
- Java 编码与字符(2)
- OC-电子词典的写法
- netbeans的界面跳转和测试点
- Eclipse 批量格式化的功能
- LM算法与非线性最小二乘问题
- java__基础复习02
- LM算法与非线性最小二乘问题
- grub rescure 解决方案
- 安装Adobe After Effects(AE)的时候卡在登陆界面?
- 从上往下打印二叉树(剑指offer)+队列的应用
- poj-2406-Power Strings(KMP)
- EPIGRAMS IN PROGRAMMING
- poj-2406-Power Strings(KMP)
- ahu 395 快速矩阵幂初学
- hdu 1163 免费的馅饼