餐馆那些事之:Decorator Pattern

1. 概述
Decorator Pattern:提供了一种通过组合给类增加职责的方法。和通过子类给类添加责任相比,这种方式更加灵活。
类图:

Object:抽象接口
ConcreteObject:工作类(需要添加责任的类)
Decorator:维护一个指向Object的指针,从而可以通过组合的方式为ConcreteObject类添加责任
ConcreteDecoratorX:待添加的新责任类

2. 实例
餐馆的厨师以前只要负责做菜就好了,洗菜,切菜什么的都有专门的人负责,后来餐馆生意不行了,洗菜、切菜的员工都被裁了,这些活现在也要厨师干了,so,使用Decorator Pattern为厨师们加点活。
代码:
#include <iostream>
using namespace std;

//Object
class Employee
{
public:
	virtual ~Employee()
	{
	}
	
	virtual void work() = 0;
};

//ConcreteObject
class Cook : public Employee
{
public:
	virtual ~Cook()
	{
	}
	
	virtual void work()
	{
		cout << "Cook do the cooking" << endl;
	}
};

//Decorator
class Decorator : public Employee
{
public:
	Decorator(Employee* emp)
	{
		_emp = emp;
	}
	
	virtual ~Decorator()
	{
	}
	
	virtual void work()
	{
		_emp->work();
	}
private:
	Employee* _emp;
};

//ConcreteDecorator
class Cutter_Washer_Decorator : public Decorator
{
public:
	Cutter_Washer_Decorator(Employee* emp): Decorator(emp)
	{
	}
	
	virtual ~Cutter_Washer_Decorator()
	{
	}
	
	void cut()
	{
		cout << "Cook cut" << endl;
	}
	
	void wash()
	{
		cout << "Cook wash" << endl;
	}
	
	virtual void work()
	{
		cut();
		wash();
		Decorator::work();
	}
};
//client
int main() 
{
	Employee* emp_cook = new Cook();
	Employee* emp_decorator = new Cutter_Washer_Decorator(emp_cook);
	
	emp_decorator->work();
	
	if(emp_cook)
	{
		delete emp_cook;
		emp_cook = NULL;
	}
	if(emp_decorator)
	{
		delete emp_decorator;
		emp_decorator = NULL;
	}
	
	return 0;
}

运行输出:
Cook cut
Cook wash
Cook do the cooking

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值