装饰者模式
常用在为已经定义好的类添加新的职责(操作),通常我们会定义一个新类继承自定义好的类,随之而来的问题是当具体子类要添加新的职责时,就要向其父类添加这个职责的抽象接口,这样当子类越多,其父类的抽象接口越多,而且继承自这个父类的所有子类都不可避免的继承了父类的接口。Decorator模式提供了一种解决方法,当添加操作时一步步的添加新的职责。
举个栗子: 手机的主要功能是上网Web,现在手机升级,我需要加入打电话Call功能。我们将其抽象到基类Function中,为了以后同类问题的可扩展,将Web等附加功能抽象成Decorator,Decorator派生自Function,其内部却有着依附的主体功能Function *pmain_.
如此, 我们将可以新职责一层层的添加进去,我们将类的装饰功能从类中剥离出去,以简化原有的类。我们甚至同过不同的装饰次序,来改变类的行为。
可以有效地将核心职责与装饰功功能区分开来,并且抽象出了重复的装饰逻辑。
#include <iostream>
#ifndef _DESIGN_PATTERN_DECORATOR_DECORATOR_HPP_
#define _DESIGN_PATTERN_DECORATOR_DECORATOR_HPP_
namespace design_pattern
{
class Function
{
public:
virtual ~Function() {}
virtual void Operation() = 0;
};
class Call : public Function
{
public:
void Operation()
{
std::cout << "Calling... ...!" << std::endl;
}
};
class Decorator : public Function
{
protected:
Function *pmain_;
public:
void set_pmain(Function * const &ptr)
{
pmain_ = ptr;
}
virtual void Operation() = 0;
};
class Web : public Decorator
{
public:
void Operation()
{
std::cout << "Browse Web Page... ...!" << std::endl;
if (nullptr != pmain_)
pmain_->Operation();
}
};
}
#endif // !_DESIGN_PATTERN_DECORATOR_DECORATOR_HPP_
// decorator_main.cpp
#include "decorator.hpp"
using namespace design_pattern;
int main()
{
Call c;
Web w;
Decorator *pd = dynamic_cast<Decorator *>(&w);
pd->set_pmain(dynamic_cast<Cellphone *>(&c));
pd->Operation();
return 0;
}