装饰模式
定义:
不改变对象前提下动态增加其职责,实现一种比子类更灵活的扩展方式
优点:
(1)比继承更灵活,不会导致类个数极度增加
(2)可以对一个对象多种装饰
(3)具体构建类和装饰类可单独变化
缺点:
(1)会产生很多小对象,占用资源
(2)需要区别每个对象的连接关系
(3)对于多次装饰类增加排错难度
使用范围:
不改变对象增加职责功能的情况
结构:
decorator_pattern为具体组件模块和装饰模块的公用抽象模块,定义公用方法。
concrete_component为具体组件模块,提供原始对象方法
decorator为装饰模块抽象类
concrete_decorator为具体装饰模块类,实现注入原始对象,实现扩展职责
实现:
namespace structural_pattern
{
class decorator_pattern
{
public:
virtual void operation() = 0;
};
class concrete_component : public decorator_pattern
{
public :
void operation() override
{
std::cout << "具体构建类对象方法" << std::endl;
}
};
class decorator : public decorator_pattern
{
public :
protected:
std::shared_ptr<decorator_pattern> comp;
};
class concrete_decorator : public decorator
{
public:
void pre_operation()
{
std::cout << "前向装饰" << std::endl;
}
void suff_operation()
{
std::cout << "后缀装饰" << std::endl;
}
void operation() override
{
std::shared_ptr<decorator_pattern> temp{ new concrete_component() };
comp = temp;
this->pre_operation();
comp.get()->operation();
this->suff_operation();
}
};
}
测试:
基于GoogleTest 的单元测试框架;框架可参考如下网址:
https://www.cnblogs.com/jycboy/p/gtest_catalog.html
using namespace structural_pattern;
TEST(test_decorator_pattern_operation, success_decorator)
{
decorator_pattern* dec = new concrete_decorator();
dec->operation();
}
总结
(1)注意透明装饰和半透明装饰模块区别,半透明装饰是在客户端实现扩展方法的调用,而透明装饰是装饰类做完所有事
(2)装饰模式在于继承同一个抽象类,实现抽象类的方法来进行装饰和实体模块连接
(3)装饰模块成员变量来组合具体组件模块