9 结构型模式-----组合模式

模式动机(Composite Pattern)将对象组合成树形结构来表示“整体-部分”层次。操作时,使得对部分的操作与对整体的操作具有一致性。

模式结构图:

典型的Composite结构为:

模式代码:

bt_组合模式.h

 1 #ifndef CP_H
 2 #define CP_H
 3 #include <iostream>
 4 #include <vector>
 5 using namespace std;
 6
 7 /*
 8     抽象部件类
 9 */
10 class Composite;
11 class Component
12 {
13 public:
14     virtual ~Component(){ }
15     virtual void Add(Component* pc) = 0;
16     virtual void Remove(Component* pc) = 0;
17     virtual Component* GetChild(unsigned int i) = 0;
18     virtual void Operation() = 0;               // 一致的操作接口
19
20 };
21
22 /*
23     组合容器类,其中既可以放组合器,又可以放叶子结点
24 */
25 class Composite : public Component
26 {
27 public:
28     virtual void Add(Component* pc)
29     {
30         this->children.push_back(pc);
31     }
32     virtual void Remove(Component* pc)
33     {
34         cout << "删除部件" << endl;
35     }
36     virtual Component* GetChild(unsigned int i)
37     {
38         if(i < this->children.size())
39             return this->children[i];
40         else
41             return NULL;
42     }
43     virtual void Operation()
44     {
45         cout << "执行容器的相应操作" << endl;
46         vector<Component*>::iterator iter = this->children.begin();
47         for(; iter != this->children.end(); iter++)
48             (*iter)->Operation();
49     }
50
51 private:
52     vector<Component*> children;
53 };
54
55 /*
56     叶子结点类
57 */
58 class Leaf : public Component
59 {
60 public:
61     virtual void Add(Component* pc)
62     {
63         cerr << "操作错误" << endl;
64         return ;
65     }
66     virtual void Remove(Component* pc)
67     {
68         cerr << "操作错误" << endl;
69         return ;
70     }
71     virtual Component* GetChild(unsigned int i)
72     {
73         cout << "操作错误" << endl;
74         return NULL;
75     }
76     virtual void Operation()
77     {
78         cout << "执行叶子的相应操作" << endl;
79     }
80 };
81
82 #endif // CP_H

测试用例.cpp

 1 #include "bt_组合模式.h"
 2
 3 int main()
 4 {
 5     cout << "***** 组合模式测试 *****" << endl;
 6     Component* pC = new Composite;
 7     Composite* pS = new Composite;
 8     Leaf* pL1 = new Leaf;
 9     Leaf* pL2 = new Leaf;
10
11     pC->Add(pL1);
12     pS->Add(pL2);
13     pC->Add(pS);
14     pC->Operation();
15
16     cout << endl;
17     pL1->Add(pL2);
18
19     delete pL2;
20     delete pL1;
21     delete pS;
22     delete pC;
23
24     return 0;
25 }


模式优缺点:

客户端可以使用一致的方法操作对象,无论该对象是Leaf还是Composite。缺点是设计更加复杂了,而且一般只适用于树状分层的关系。

时间: 2024-10-22 15:43:15

9 结构型模式-----组合模式的相关文章

设计模式(结构型)之组合模式(Composite Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之桥接模式(Bridge Pattern)> http://blog.csdn.net/yanbober/article/details/45366781 概述 组合模式又叫做部分-整体模式,使我们在树型结构的问题中模糊简单元素和复杂元素的概念,客户程序可以像

结构型模式-组合模式(树形结构的处理)

目录 1. 定义 2. 结构 3. 代码实现 4. 透明组合模式与安全组合模式 4.1 透明组合模式 4.1 安全组合模式 5. 优缺点 6. 适用场景 7. 个人理解 参考 树形结构在软件中随处可见,例如操作系统中的目录结构.应用软件中的菜单.办公系统中的公司组织结构等. 组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,也可以一致性地处理树形结构中的叶子节点(不包含子节点的节点)和容器节点(包含子节点的节点). 1. 定义 组合模式(Composite

结构型模式-组合模式

1.定义 将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 2.介绍 组合模式属于结构型模式. 组合模式有时叫做部分-整体模式,主要是描述部分与整体的关系. 组合模式实际上就是个树形结构,一棵树的节点如果没有分支,就是叶子节点;如果存在分支,则是树枝节点. 我们平时遇到的最典型的组合结构就是文件和文件夹了,具体的文件就是叶子节点,而文件夹下还可以存在文件和文件夹,所以文件夹一般是树枝节点. 3.UML类图 角色说明: Component

java设计模式--结构型模式--组合模式

什么是组合模式,这个有待研究,个人觉得是各类组合而形成的一种结构吧. 组合模式: 1 组合模式 2 概述 3 将对象组合成树形结构以表示"部分-整体"的层次结构."Composite使得用户对单个对象和组合对象的使用具有一致性." 4 5 6 适用性 7 1.你想表示对象的部分-整体层次结构. 8 9 2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象. 10 11 12 参与者 13 1.Component 14 为组合中的对象声明接

设计模式--结构型模式--组合模式

1.组合模式 拿剪发办卡的事情来分析一下吧. 首先,一张卡可以在总部,分店,加盟店使用,那么总部可以刷卡,分店也可以刷卡,加盟店也可以刷卡,这个属性结构的店面层级关系就明确啦. 那么,总店刷卡消费与分店刷卡消费是一样的道理,那么总店与分店对会员卡的使用也具有一致性. 例子 那么加盟店就相当于叶子节点,分店和总店属于分支节点. 那我们的目的是什么呢?就是当我们在总店刷卡的时候,所有的下属店面都有了你的刷卡积分信息.因此,我们需要对具有层级关系的总店,分店,加盟店进行一致的处理,在刷卡的时候不需要关

第10章 结构型模式—组合模式

1. 组合模式(Composite Pattern)的定义 (1)将对象组合成树型结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. (2)组合模式的结构和说明 ①Component:抽象的组件对象,为组合中的对象声明接口,让客户端可以通过这个接口来访问和管理整个对象结构,可以在里面为定义的功能提供缺省的实现. ②Leaf:叶子节点对象,定义和实现叶子对象的行为,不再包含其他子节点对象. ③Composite:组合对象,通常会存储子组件,定义包含子组件的那

设计模式(结构型)之外观模式(Facade Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之装饰者模式(Decorator Pattern)>http://blog.csdn.net/yanbober/article/details/45395747 概述 一个客户类需要和多个业务类交互,而这些业务类经常会作为整体出现,由于涉及到的类比较多,导致使

设计模式(结构型)之代理模式(Proxy Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之享元模式(Flyweight Pattern)>http://blog.csdn.net/yanbober/article/details/45477551 概述 代理模式是常用的结构型设计模式之一,当无法直接访问某个对象或访问某个对象存在困难时可以通过一个

【设计模式】-结构型-7-组合模式

主要角色 抽象构件(Component)角色:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为.在透明式的组合模式中抽象构件还声明访问和管理子类的接口:在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成. 树叶构件(Leaf)角色:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口. 树枝构件(Composite)角色:是组合中的分支节点对象,它有子节点.它实现了抽象构件角色中声明的接口,它的主要作用是存储和管理子部件,通常包含 A