装饰模式
2016-06-29 20:16
169 查看
<pre name="code" class="cpp">
<span style="font-size:18px;">// test01.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <vector> #include<string> #include<stdio.h> using namespace std; //抽象基类,定义一个对象接口,可以为这个接口动态的添加职责 class Component { public: Component() {} virtual ~Component() {} //纯虚函数,由派生类实现 virtual void Operation() = 0; }; //派生自Component,在这里表示需要给它动态添加职责的类 class ConcreteComponent :public Component { public: ConcreteComponent() {}; ~ConcreteComponent() {}; void Operation() { cout << "ConcreteComponent operator.." << endl; } }; //抽象基类,维护一个指向Component对象的指针 class Decorator :public Component { public: Decorator(Component *com) { this->_com = com; } void Operation() { }; virtual ~Decorator() { //delete _com; } protected: Component *_com; }; //派生自Decorator,用来装饰ConcreteComponent类(这里ConcreteComponent类只是基类Component派生出的一个类,也可以是其他类) class ConcreteDecoratorA :public Decorator { public: ConcreteDecoratorA(Component *com) :Decorator(com) {}; virtual void Operation() { _com->Operation(); AddedBehaviorA(); } void AddedBehaviorA() { cout << "ConcreteDecoratorA::AddedBehaviorA..." << endl; } virtual ~ConcreteDecoratorA() {} }; //也是派生自Decorator,用来装饰ConcreteComponent类 class ConcreteDecoratorB:public Decorator { public: ConcreteDecoratorB(Component *com) :Decorator(com) {}; virtual void Operation() { _com->Operation(); AddedBehaviorB(); } void AddedBehaviorB() { cout << "ConcreteDecoratorB::AddedBehaviorB..." << endl; } virtual ~ConcreteDecoratorB() {} }; int main() { //初始化一个ConcreteComponent对象 ConcreteComponent *com = new ConcreteComponent(); //采用这个ConcreteComponent对象去初始化一个ConcreteDecoratorA对象 //这样就可以为这个Component对象动态添加职责 ConcreteDecoratorA *decA = new ConcreteDecoratorA(com);//装饰A ConcreteDecoratorB *decB = new ConcreteDecoratorB(decA);//装饰B decB->Operation(); delete com; delete decA; delete decB; return 0; } </span>
装饰模式的关键点:在Decorator里面定义了一个Compontent 定义了一个指向Component的指针,从而可以实现多态,动态绑定各个派生类。
PS.如果只有一个ConcreteComponent类,就可以不需要Component这个抽象类,这样直接让Decorator类继承ConcreteComponent类就可以了。同样的道理,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独Decorator类,而可以把Decorator类和ConcreteDecorator类的责任合并成一个类。
相关文章推荐
- Java反射中的范型相关类
- JAVA常见小问题
- c++虚基类
- mapreduce的架构
- 提示框的实现
- android Sensor相关工作
- Leetcode 130. Surrounded Regions
- c++多重继承
- tomcat线上更新后台管理程序代码
- 技术至上
- SpringMVC入门-第一节:简介
- windbg+网线双机调试内核
- [51CTO学院三周年]+<<一个巴士阿叔和Linux不得不說的故事>>
- 树莓派GPIO控制--python篇
- 获得打气筒的三种方式,以及ListView的使用与优化
- 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式
- std::function用法
- Android 6.0编译问题
- 1.逐帧动画shader
- CEF源码编译