设计模式读书笔记: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)

Decorator装饰器模式就是创建一个新类为某一个类动态添加新功能或增强原有的功能. 特点: 装饰器持有一个被装饰的对象; 装饰器和被装饰的对象有相同的接口; 装饰器给被装饰的对象添加额...

《Head First设计模式》 读书笔记03 装饰对象

《Head First设计模式》读书笔记03 装饰对象 问题引入 咖啡店的类设计: 一个饮料基类,各种饮料类继承这个基类,并且计算各自的价钱。 饮料中需要加入各种调料,考虑在基类中加入一...

《设计模式》读书笔记:装饰者模式

家里的小面摊或多或少都有点名气,最早的记忆中,他们会使用小铁片了来识别你点的面要什么浇头,比如三角的表示牛肉,圆形的代表杂酱的.后来,随着时代的进步,他们也开始使用更方便的电子化的记账方式. 对于那时...

装饰者模式(heade first设计模式读书笔记)

装饰者模式动态地将责任添加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。 装饰者与被装饰对象有相同的超类型。 你可以用一个或者多个装饰者包装一个对象。 既然装饰者和被装饰者有相同的超类...

大话设计模式读书笔记(四) 装饰模式

装饰模式、IO流中的装饰模式。
  • xsyfl
  • xsyfl
  • 2017年04月05日 20:17
  • 94

《Android源码设计模式》读书笔记 (21) 第21章 装饰模式

前言 装饰模式其实是继承关系的一种替代方案之一,是一种对客户端透明的方式来动态地扩展对象的功能. 因为近期入职了新公司,还是把设计模式都在温习一遍. 正文 定义:动态地给一个对象添加一些额外的职责.就...

设计模式读书笔记-----装饰者模式

我们都知道,可以使用两种方式给一个类或者对象添加行为。         一是使用继承。继承是给一个类添加行为的比较有效的途径。通过使用继承,可以使得子类在拥有自身方法的同时,还可以拥有父类的方法。但...

《Head First设计模式》读书笔记之装饰模式

好久没写笔记了,原因是最近在帮老师写一个项目的android客户端,算是我第二个比较正式的android软件吧。我觉得知识得一块一块的学习并加以应用才能完全的理解它,就拿android来说,首先了解整...

【Head First设计模式-读书笔记】装饰者模式

类图定义 装饰者模式-动态的将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。   实际上就是组合的一种比较巧妙的用法。选择一个主体,然后选择不同的组件进行组装。这样的模式更加灵...
  • A__yes
  • A__yes
  • 2016年01月26日 09:59
  • 313

《大话设计模式》读书笔记:装饰模式与均值计算实例

装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 装饰模式在不改变原类文件和继承关系的情况下,用被装饰对象的父类新派生一个装饰对象,用...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式读书笔记:Decorator(装饰)
举报原因:
原因补充:

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