组合(Composite)模式 in C++
作者:博亚体育app 发布时间:2021-11-06 05:15
本文摘要:作者:MichaelGe出处:https://segmentfault.com/a/1190000038974116组合模式,将工具组合成树形结构以表现“部门-整体”的条理结构,组合模式使得用户对单个工具和组合工具的使用具有一致性。ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ——Erich Gamma et. al.伊始组合(Composite)模式,又叫作 部门-整体 模式,它是一种将工具组合成树状的条理结构的模式,用来表现“部门-整体”的关系,使用户对单个工具和组合工具具有一致的会见性。

博亚体育app

作者:MichaelGe出处:https://segmentfault.com/a/1190000038974116组合模式,将工具组合成树形结构以表现“部门-整体”的条理结构,组合模式使得用户对单个工具和组合工具的使用具有一致性。ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ ——Erich Gamma et. al.伊始组合(Composite)模式,又叫作 部门-整体 模式,它是一种将工具组合成树状的条理结构的模式,用来表现“部门-整体”的关系,使用户对单个工具和组合工具具有一致的会见性。

结构模型■Component:抽象的组件工具,为组合中的工具声明接口,让客户端可以通过这个接口来会见和治理整个工具结构,可以在内里为界说的功效提供缺省的实现。■Leaf:叶子节点工具,界说和实现叶子工具的行为,不再包罗其他的子节点工具。■Composite:组合工具,通常会存储子组件,界说包罗子组件的那些组件的行为,并实现在组件接口中界说的与子组件有关的操作。■Client:客户端,通过组件接口来操作组合结构内里的组件工具。

博亚体育

实现域Component 界说struct Component { virtual ~Component(){} ABSTRACT(void process()); virtual void add(Component*) { return; } virtual void remove(Component*) { return; }};注意,上面 ABSTRACT 是一个C++封装宏,表现界说的方法是纯虚函数,亦即接口,原型如下:#define ABSTRACT(...) virtual __VA_ARGS__ = 0由于叶子工具没有 add 和 remove 方法的,这里在抽象类提供了一份默认实现。叶子工具 Leaf 界说struct Leaf : Component { OVERRIDE(void process()) { /* do process self */ }};其中,上面 OVERRIDE 也是一个C++封装宏,表现实现或者覆写父类的接口(或方法),原型如下:#define OVERRIDE(...) virtual __VA_ARGS__ override组合工具 Composite 界说using Components = std::list<Component*>;struct Composite : Component { explicit Composite(const std::string& name) : name_{name} {} OVERRIDE(void process()) { /* do process self */ /* process child */ for (auto& c : components_) { c->process(); } } OVERRIDE(void add(Component* component)) { components_.push_back(component) } OVERRIDE(void remove(Component* component)) { components_.remove(component) }private: std::string name_; Components components_;};用户使用这里假设用户需要设计一个治理 商品种别树的场景 ,如下- 商品 - 服装 - 男装 - 女装 - 书籍 - 中文书籍 - 外文书籍使用组合模式,如下void process(Component& component) { component.process();}int main() { Composite root("商品"); Composite dress("服装"); Composite book("书籍"); Leaf man_dress("男装"); Leaf women_dress("女装"); Leaf book_zh("中文书籍"); Leaf book_foreign("外文书籍"); root.add(&dress); dress.add(&man_dress); dress.add(&women_dress); root.add(&book); book.add(&book_zh); book.add(&book_foreign); process(root);}优缺点优点1.界说了包罗基本工具和组合工具的类条理结构,基本工具可以被组合成庞大的组合工具,而组合工具又可以组合成更庞大的组合工具,可以不停地递归组合下去,从而组成一个统一的组合工具的类条理结构。2.组合模式使得客户端代码可以一致地处置惩罚单个工具和组合工具,无须体贴自己处置惩罚的是单个工具,还是组合工具,这简化了客户端代码;3.更容易在组合体内加入新的工具,客户端不会因为加入了新的工具而更改源代码,满足“开闭原则”;缺点1.不容易限制容器中的构件;2.不容易用继续的方法来增加构件的新功效;End学习是输入,分享是输出,坚持连续分享。

作者:MichaelGe出处:https://segmentfault.com/a/1190000038974116。


本文关键词:组合,Composite,模式,C++,作者,MichaelGe,出处,https,博亚体育app

本文来源:博亚体育-www.zbjiaogun.com

电话
099-975333703