设计模式读书笔记:Decorator(装饰)

原创 2015年07月10日 16:28:02

意图:

动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

结构图:来自 《23种设计模式 - 郗晓勇》


实现:https://github.com/panshiqu/patterns/tree/master/Decorator

Component

namespace NS_DECORATOR {

class Component {
public:
	Component() {}
	virtual ~Component() {}
	virtual void operation(void) = 0;
};

} /* namespace NS_DECORATOR */
ConcreteComponent

#include "Component.h"
#include <iostream>

namespace NS_DECORATOR {

class ConcreteComponent : public Component
{
public:
	ConcreteComponent() {}
	virtual ~ConcreteComponent() {}
	virtual void operation(void)
	{
		std::cout << "ConcreteComponent" << std::endl;
	}
};

} /* namespace NS_DECORATOR */
Decorator

#include "Component.h"

namespace NS_DECORATOR {

class Decorator : public Component
{
public:
	Decorator(Component *component) : _component(component) {}
	virtual ~Decorator() {}
	virtual void operation(void)
	{
		_component->operation();
	}

private:
	Component *_component;
};

} /* namespace NS_DECORATOR */
ConcreteDecoratorA

#include "Decorator.h"
#include <iostream>

namespace NS_DECORATOR {

class ConcreteDecoratorA : public Decorator
{
public:
	ConcreteDecoratorA(Component *component) : Decorator(component) {}
	virtual ~ConcreteDecoratorA() {}
	virtual void operation(void)
	{
		Decorator::operation();
		addBehavior();
	}
	void addBehavior(void)
	{
		std::cout << "Jump" << std::endl;
	}
};

} /* namespace NS_DECORATOR */
ConcreteDecoratorB

#include "Decorator.h"
#include <iostream>

namespace NS_DECORATOR {

class ConcreteDecoratorB : public Decorator
{
public:
	ConcreteDecoratorB(Component *component) : Decorator(component) {}
	virtual ~ConcreteDecoratorB() {}
	virtual void operation(void)
	{
		Decorator::operation();
		addBehavior();
	}
	void addBehavior(void)
	{
		std::cout << "Move" << std::endl;
	}
};

} /* namespace NS_DECORATOR */
main

#include "Decorator/ConcreteComponent.h"
#include "Decorator/ConcreteDecoratorA.h"
#include "Decorator/ConcreteDecoratorB.h"
using namespace NS_DECORATOR;
using namespace std;
int main(void)
{
	ConcreteComponent cc;
	cc.operation();

	cout << "----------" << endl;

	ConcreteDecoratorA cda(&cc);
	cda.operation();

	cout << "----------" << endl;

	ConcreteDecoratorB cdb(&cda);
	cdb.operation();
}
附加:
版权声明:本文为博主原创文章,未经博主允许不得转载。

设计模式——装饰模式(Decorator)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1、概念 ...
  • u012909091
  • u012909091
  • 2014年08月18日 20:23
  • 18589

研磨设计模式 之 装饰模式(Decorator)1——跟着cc学设计系列

22.1  场景问题 22.1.1  复杂的奖金计算        考虑这样一个实际应用:就是如何实现灵活的奖金计算。 奖金计算是相对复杂的功能,尤其是对于业务部门的奖金计算方式,是非常复杂的,...
  • u013019926
  • u013019926
  • 2013年12月05日 10:10
  • 675

C++设计模式::装饰模式or代理模式or面向切片编程(AOP)

一个实例 装饰模式:动态地给一个对象(而非一个类)添加一些额外的职责。就增加功能来说,装饰模式比创建子类更加灵活,因为有时我们的需求是给某个对象而不是整个类添加一些功能,比如为一部手机添加增加挂...
  • lanchunhui
  • lanchunhui
  • 2015年11月20日 21:16
  • 1361

Android设计模式之一个例子让你彻底明白装饰者模式(Decorator Pattern)

导读这篇文章中我不会使用概念性文字来说明装饰者模式,因为通常概念性的问题都很抽象,很难懂,使得读者很难明白到底为什么要使用这种设计模式,我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了某种困难,...
  • nugongahou110
  • nugongahou110
  • 2015年12月27日 19:40
  • 2970

【设计模式】之装饰器(Decorator)模式

【设计模式】之装饰器(Decorator)模式 通常给对象添加功能,要么直接修改对象添加相应的功能,要么派生对应的子类来扩展,抑或是使用对象组合的方式。显然,直接修改对应的类这种方式并不可取。在面...
  • Xiao_Spring
  • Xiao_Spring
  • 2017年03月29日 15:32
  • 611

2.4 Decorator(装饰) -- 对象结构型模式

模式定义:         装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。         装饰者和被装饰者有相同的超累类型。       ...
  • qianqiuwanzi
  • qianqiuwanzi
  • 2015年05月03日 21:55
  • 339

设计模式学习-Decorator(装饰)

 意图:动态的为一个对象添加一些额外的职责,Decorator比子类更加灵活示例图:适用性:在不影响对象的情况下,以动态,透明的方式给单个对象添加职责处理那些可以撤销的职责但不能使用子类进行扩充时/类...
  • valetine
  • valetine
  • 2011年05月10日 22:07
  • 236

C# 设计模式-装饰(Decorator)

动态地给对象添加一些额外的职责功能主要组成: Component-抽象父类(接口) ConcreteComponent-具体对象 Decorator-装饰父类 ConcreteDecorato...
  • m0_37862405
  • m0_37862405
  • 2017年12月30日 19:16
  • 20

c++设计模式----Decorator(装饰)

装饰模式: 意图: 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。  适用性:            在不影响其他对象的情况下,以动态、...
  • chenxun2009
  • chenxun2009
  • 2015年09月17日 23:12
  • 673

【初学设计模式】Decorator (装饰)

设计模式, Design Patterns, Decorator, 装饰, C++, UML
  • blackboyofsnp
  • blackboyofsnp
  • 2011年03月17日 20:09
  • 389
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式读书笔记:Decorator(装饰)
举报原因:
原因补充:

(最多只允许输入30个字)