微信网站开发视频,攀枝花建设集团网站,广西南宁最新确诊名单,工程交易服务主页本文章属于专栏- 概述 - 《设计模式#xff08;极简c版#xff09;》-CSDN博客 模式说明#xff1a;
方案#xff1a; 装饰类和派生类同根#xff0c;然后装饰类中放一个派生类#xff0c;以在接口不动的情况下增加功能优点#xff1a; 可以灵活地扩展对象功能#xf… 本文章属于专栏- 概述 - 《设计模式极简c版》-CSDN博客 模式说明
方案 装饰类和派生类同根然后装饰类中放一个派生类以在接口不动的情况下增加功能优点 可以灵活地扩展对象功能相比继承更易读。缺点 增加了许多小对象易于出错不易调试。
本质思想 派生类和装饰类都继承Base然后装饰器类中放一个Base指针存派生类。这样装饰器类和派生类可以放一个数组中调用相同接口这样部分类的功能看起来像被装饰了。前面是核心思想基于这个再扩展很容易基于装饰器加装饰器或者把有相似接口的装饰器抽象出一个装饰器基类。
实践建议
注意组合关系确保装饰器和被装饰对象之间的接口一致。装饰器的功能应该是可组合的可叠加的。
代码示例
#include iostream// Component Interface
class Bird {
public:virtual void fly() const 0;
};// Concrete Component
class Sparrow : public Bird {
public:void fly() const override {std::cout Sparrow is flying. std::endl;}
};// Concrete Decorator
class RedFeatherDecorator : public Bird {
private:Bird *bird;public:explicit RedFeatherDecorator(Bird *b) : bird(b) {}void fly() const override {bird-fly();std::cout With red feathers. std::endl;}
};int main() {Bird *sparrow new Sparrow();Bird *redSparrow new RedFeatherDecorator(sparrow);redSparrow-fly();/*
输出:Sparrow is flying.With red feathers.
*/delete sparrow;delete redSparrow;return 0;
}