全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++如何实现一个装饰器(Decorator)设计模式?(代码示例)

装饰器模式在C++中通过组合替代继承,用抽象基类Component定义统一接口,具体装饰器持基类指针转发并增强操作。

在C++中实现装饰器模式,核心是用组合代替继承,动态地为对象添加新功能,而不改变其原有接口。它依赖抽象基类定义统一接口,具体装饰器继承该基类并持有一个被装饰对象的指针(通常是基类指针),在转发调用的同时增强行为。

定义抽象组件接口

所有可被装饰的对象(包括原始组件和装饰器本身)都需实现同一接口:

class Component {
public:
    virtual ~Component() = default;
    virtual void operation() const = 0;
};

实现具体组件(Concrete Component)

这是被装饰的原始对象,提供基础行为:

class ConcreteComponent : public Component {
public:
    void operation() const override {
        std::cout << "ConcreteComponent: basic operation\n";
    }
};

定义抽象装饰器基类

饰器也继承自 Component,内部持有一个 Component*(或智能指针),构造时传入被装饰对象:

class Decorator : public Component {
protected:
    std::unique_ptr component_;

public: explicit Decorator(std::uniqueptr comp) : component(std::move(comp)) {}

void operation() const override {
    if (component_) {
        component_->operation();
    }
}

};

实现具体装饰器(如日志、计时等)

每个装饰器重写 operation(),在调用父类转发前/后插入额外逻辑:

class LoggingDecorator : public Decorator {
public:
    explicit LoggingDecorator(std::unique_ptr comp)
        : Decorator(std::move(comp)) {}
void operation() const override {
    std::cout << "[LOG] Before operation\n";
    Decorator::operation(); // 转发给被装饰对象
    std::cout << "[LOG] After operation\n";
}

};

class TimingDecorator : public Decorator { public: explicit TimingDecorator(std::unique_ptr comp) : Decorator(std::move(comp)) {}

void operation() const override {
    auto start = std::chrono::high_resolution_clock::now();
    Decorator::operation();
    auto end = std::chrono::high_resolution_clock::now();
    auto ms = std::chrono::duration_cast(end - start).count();
    std::cout << "[TIME] Operation took " << ms << " ms\n";
}

};

使用方式:链式装饰

支持多层装饰,顺序决定执行顺序(最外层装饰器最先执行):

int main() {
    std::unique_ptr comp = std::make_unique();
comp = std::make_unique(std::move(comp));
comp = std::make_unique(std::move(comp));

comp->operation();
// 输出:
// [LOG] Before operation
// [TIME] Operation took X ms
// ConcreteComponent: basic operation
// [TIME] Operation took X ms
// [LOG] After operation

}

注意:装饰器不修改原对象,而是包装它;推荐用 std::unique_ptr 管理所有权,避免裸指针和内存泄漏;若需运行时解绑,可用 std::shared_ptr 配合弱引用策略。


# c++  # 父类  # 指针  # 继承  # 接口  # class  # public  # 对象  # 链式  # 这是  # 而不  # 转发给  # 若需  # 最外层  # ConcreteComponent  # override  # std  # void 


相关文章: c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  制作表格网站有哪些,线上表格怎么弄?  简单实现Android文件上传  如何选择建站程序?包含哪些必备功能与类型?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  建站主机是什么?如何选择适合的建站主机?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  网站图片在线制作软件,怎么在图片上做链接?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  广州美橙建站如何快速搭建多端合一网站?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  在线ppt制作网站有哪些,请推荐几个好的课件下载的网站?  如何用VPS主机快速搭建个人网站?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?  沈阳个人网站制作公司,哪个网站能考到沈阳事业编招聘的信息?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  如何用PHP快速搭建高效网站?分步指南  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  做企业网站制作流程,企业网站制作基本流程有哪些?  三星网站视频制作教程下载,三星w23网页如何全屏?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  网站制作难吗安全吗,做一个网站需要多久时间?  北京网站制作网页,网站升级改版需要多久?  如何挑选优质建站一级代理提升网站排名?  如何在IIS中新建站点并配置端口与IP地址?  网站企业制作流程,用什么语言做企业网站比较好?  如何选择服务器才能高效搭建专属网站?  制作网站建设的公司有哪些,网站建设比较好的公司都有哪些?  魔方云NAT建站如何实现端口转发?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何彻底删除建站之星生成的Banner?  香港网站服务器数量如何影响SEO优化效果?  如何通过wdcp面板快速创建网站?  宿州网站制作公司兴策,安徽省低保查询网站?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  建站之星备案流程有哪些注意事项?  如何在云主机快速搭建网站站点?  常州企业网站制作公司,全国继续教育网怎么登录?  深圳网站制作平台,深圳市做网站好的公司有哪些?  建站之星如何实现五合一智能建站与营销推广?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  如何批量查询域名的建站时间记录?  网站制作需要会哪些技术,建立一个网站要花费多少?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何在万网ECS上快速搭建专属网站?  网站设计制作公司地址,网站建设比较好的公司都有哪些?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  如何快速配置高效服务器建站软件? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。