设计模式读书笔记: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();
}
附加:

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

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

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

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

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

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

装饰模式、IO流中的装饰模式。
  • xsyfl
  • xsyfl
  • 2017-04-05 20:17
  • 63

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

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

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

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

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

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

【读书笔记】初尝设计模式-1 装饰模式

装饰模式(Decorator) 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 首先有那么一个裸睡的人,早上起来准备穿衣服了,如下,show方法显示他穿衣服的步骤...

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

装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。 装饰模式在不改变原类文件和继承关系的情况下,用被装饰对象的父类新派生一个装饰对象,用...

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

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

大话设计模式读书笔记3 装饰模式

person.java package org.ustc.decorator; public class Person { public String name; public Stri...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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