1. 概述
Decorator Pattern:提供了一种通过组合给类增加职责的方法。和通过子类给类添加责任相比,这种方式更加灵活。
类图:
Object:抽象接口
ConcreteObject:工作类(需要添加责任的类)
Decorator:维护一个指向Object的指针,从而可以通过组合的方式为ConcreteObject类添加责任
ConcreteDecoratorX:待添加的新责任类
2. 实例
餐馆的厨师以前只要负责做菜就好了,洗菜,切菜什么的都有专门的人负责,后来餐馆生意不行了,洗菜、切菜的员工都被裁了,这些活现在也要厨师干了,so,使用Decorator Pattern为厨师们加点活。
代码:
运行输出:
Cook cut
Cook wash
Cook do the cooking
Decorator Pattern:提供了一种通过组合给类增加职责的方法。和通过子类给类添加责任相比,这种方式更加灵活。
类图:
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