概述
装饰模式(decorator pattern) 的原始定义是:动态的给一个对象添加一些额外的职责. 就扩展功能而言,装饰器模式提供了一种比使用子类更加灵活的替代方案。
装饰模式原理
装饰模式中的角色:
- 抽象构件角色 :它是具体构件和抽象装饰类的共同父类,声明了在具体构件中实现的业务方法.它引进了可以使客户端以一致的方式处理未被装饰的对象以及装饰之后的对象,实现客户端的透明操作
- 具体构件角色 :它是抽象构件类的子类,用于定义具体的构建对象,实现了在抽象构建中声明的方法,装饰类可以给它增加额外的职责(方法).
- 抽象装饰角色 :它也是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现.它维护了一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的.
- 具体装饰角色 : 它是抽象装饰类的子类,负责向构件添加新的职责.每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用于扩充对象的行为.
代码案例
抽象构建类:
class Context { public: bool isMgr; // User user; // double groupsale; }; class CalcBonus { public: CalcBonus(CalcBonus * c = nullptr) : cc(c) {} virtual double Calc(Context &ctx) { return 0.0; } virtual ~CalcBonus() {} protected: CalcBonus* cc; };
具体装饰角色:
class CalcMonthBonus : public CalcBonus { public: CalcMonthBonus(CalcBonus * c) : CalcBonus(c) {} virtual double Calc(Context &ctx) { double mbonus /*= 计算流程忽略*/; return mbonus + cc->Calc(ctx); } };
下边这个类,不一样的,可以当做管理者角色的计算方法;也就是Context isMgr为true时的计算。
class CalcGroupBonus : public CalcBonus { public: CalcGroupBonus(CalcBonus * c) : CalcBonus(c) {} virtual double Calc(Context &ctx) { double gbnonus /*= 计算流程忽略*/; return gbnonus + cc->Calc(ctx); } };
小结
装饰模式动态的给一个对象添加一些额外的职责. 就扩展功能而言,装饰器模式提供了一种比使用子类更加灵活的替代方案。在现实中很常见的,比如不同部门,不同员工工作职责不一样,都是在做同一件事,就可以使用这种方法。OK,翻篇。感兴趣,可以来学习学习。