23种设计模式 - 组合模式(Composite)
组合模式Composite—— 文件夹套文件夹统一操作大白话解释你的电脑里 文件不能再包含东西 文件夹可以装文件也可以装文件夹 关键点来了不管是文件还是文件夹你都可以查看大小打印信息组合模式把对象组合成树形结构让单个对象和组合对象的使用方式一致。你可以对整棵树统一操作不用关心里面是叶子还是容器。常见场景文件系统文件 文件夹UI 组件树按钮、面板、容器部门组织架构员工 部门XML/HTML DOM 树C 代码示例场景文件系统统一计算大小、统一打印目录树。#includeiostream#includestring#includevector#includememory// // 组件接口文件和文件夹都实现// classFileSystemNode{public:virtual~FileSystemNode()default;virtualstd::stringgetName()const0;virtuallonglonggetSize()const0;virtualvoidprint(conststd::stringindent)const0;// 对于叶子节点文件这些操作无意义默认什么都不做virtualvoidadd(std::shared_ptrFileSystemNodenode){std::cout错误不能向文件添加子节点\n;}virtualvoidremove(conststd::stringname){}};// // 叶子节点文件// classFile:publicFileSystemNode{private:std::string name;longlongsize;// 字节public:File(conststd::stringn,longlongs):name(n),size(s){}std::stringgetName()constoverride{returnname;}longlonggetSize()constoverride{returnsize;}voidprint(conststd::stringindent)constoverride{std::coutindent name (size bytes)\n;}};// // 容器节点文件夹// classFolder:publicFileSystemNode{private:std::string name;std::vectorstd::shared_ptrFileSystemNodechildren;public:Folder(conststd::stringn):name(n){}std::stringgetName()constoverride{returnname;}// 递归计算大小所有子节点大小之和longlonggetSize()constoverride{longlongtotal0;for(constautochild:children){totalchild-getSize();}returntotal;}voidadd(std::shared_ptrFileSystemNodenode)override{children.push_back(node);}voidremove(conststd::stringn)override{children.erase(std::remove_if(children.begin(),children.end(),[n](constautoc){returnc-getName()n;}),children.end());}// 递归打印目录树voidprint(conststd::stringindent)constoverride{std::coutindent name (getSize() bytes)\n;for(constautochild:children){child-print(indent );// 子节点多缩进两格}}};intmain(){// 构建目录树autorootstd::make_sharedFolder(项目根目录);autosrcstd::make_sharedFolder(src);src-add(std::make_sharedFile(main.cpp,2048));src-add(std::make_sharedFile(utils.cpp,1536));src-add(std::make_sharedFile(utils.h,512));autotestsstd::make_sharedFolder(tests);tests-add(std::make_sharedFile(test_main.cpp,1024));tests-add(std::make_sharedFile(test_utils.cpp,768));autodocsstd::make_sharedFolder(docs);docs-add(std::make_sharedFile(README.md,4096));docs-add(std::make_sharedFile(API.md,8192));autoassetsstd::make_sharedFolder(assets);autoimagesstd::make_sharedFolder(images);images-add(std::make_sharedFile(logo.png,102400));images-add(std::make_sharedFile(banner.jpg,204800));assets-add(images);assets-add(std::make_sharedFile(style.css,10240));root-add(src);root-add(tests);root-add(docs);root-add(assets);root-add(std::make_sharedFile(.gitignore,256));// 打印目录树std::cout 目录结构 \n;root-print();// 统一接口对文件夹和文件都能问大小std::cout\n 各目录大小 \n;std::coutsrc 目录: src-getSize() bytes\n;std::coutdocs 目录: docs-getSize() bytes\n;std::coutassets 目录: assets-getSize() bytes\n;std::cout整个项目: root-getSize() bytes\n;return0;}输出 目录结构 项目根目录 (335872 bytes) src (4096 bytes) main.cpp (2048 bytes) utils.cpp (1536 bytes) utils.h (512 bytes) tests (1792 bytes) test_main.cpp (1024 bytes) test_utils.cpp (768 bytes) docs (12288 bytes) README.md (4096 bytes) API.md (8192 bytes) assets (317440 bytes) images (307200 bytes) logo.png (102400 bytes) banner.jpg (204800 bytes) style.css (10240 bytes) .gitignore (256 bytes) 各目录大小 src 目录: 4096 bytes docs 目录: 12288 bytes assets 目录: 317440 bytes 整个项目: 335872 bytes优缺点说明✅ 优点树形结构的天然实现方式✅ 优点客户端统一对待叶子和容器✅ 优点新增节点类型很方便❌ 缺点设计过于通用类型安全性降低❌ 缺点不适合限制树的层次结构一句话记忆组合模式 文件夹里可以放文件也可以放文件夹对外一律问你多大不管是不是叶子。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2452974.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!