Composite 模式的实现

实现要点:


1.组合模式采用树形结构来实现普遍存在的对象容器,从而将“一对多”的关系转化“一对一”的关系,使得客户代码可以一致地处理对象和对象容器,无需关心处理的是单个的对象,还是组合的对象容器。

2.将“客户代码与复杂的对象容器结构”解耦是组合模式的核心思想,解耦之后,客户代码将与纯粹的抽象接口——而非对象容器的复内部实现结构——发生依赖关系,从而更能“应对变化”。

3.组合模式中,是将“Add和Remove等和对象容器相关的方法”定义在“表示抽象对象的Component类”中,还是将其定义在“表示对象容器的Composite类”中,是一个关乎“透明性”和“安全性”的两难问题,需要仔细权衡。这里有可能违背面向对象的“单一职责原则”,但是对于这种特殊结构,这又是必须付出的代价。

4.组合模式在具体实现中,可以让父对象中的子对象反向追溯;如果父对象有频繁的遍历需求,可使用缓存技巧来改善效率。

5. 客户端尽量不要直接调用树叶类的方法,而是借助其父类(Component)的多态性完成调用,这样可以增加代码的复用性。

使用场景:

以下情况下适用组合模式:

1.你想表示对象的部分-整体层次结构。

2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。


  /////////////////Component.h////////////////////////
 1 #pragma once
2 class Component
3 {
4 public:
5 virtual ~Component();
6 Component();
7 virtual void Operation() = 0 ;
8 virtual void Add( Component*);
9 virtual void Remove( Component*);
10 virtual Component* GetChild(int);
11 protected:
12 private:
13 };


 1 /////////////////Component.cpp////////////////////////
2 #include "Component.h"
3 Component::Component()
4 {
5
6 }
7 Component::~Component()
8 {
9
10 }
11 void Component::Add( Component* com)
12 {
13
14 }
15
16 void Component::Remove( Component* com)
17 {
18
19 }
20 void Component::Operation()
21 {
22
23 }
24 Component* Component::GetChild(int index)
25 {
26 return 0;
27 }


 1 /////////////////Composite.h////////////////////////
2 #pragma once
3 #include "Component.h"
4 #include <vector>
5 using namespace std;
6 class Composite : public Component
7 {
8 public:
9 Composite(const string&);
10 ~Composite();
11 void Operation() ;
12 void Add( Component*);
13 void Remove( Component*);
14 Component* GetChild(int);
15 protected:
16 private:
17 vector<Component*> comVec ;
18 string _name ;
19 };


 1 /////////////////Composite.cpp////////////////////////
2 #include "Composite.h"
3 #include "Component.h"
4 #include <iostream>
5 #include <string>
6 using namespace std;
7
8 Composite::Composite(const string& name)
9 {
10 _name = name ;
11 }
12 Composite::~Composite()
13 {
14
15 }
16 void Composite::Operation()
17 {
18 cout<<"Composite operation : "<<_name<<endl;
19 vector<Component*>::iterator iter = comVec.begin();
20 for (;iter != comVec.end() ; iter++)
21 {
22
23 if (_name == "Com2")
24 {
25 cout<<"------";
26 }
27 if (_name == "Com1")
28 {
29 cout<<"---";
30 }
31
32 (*iter)->Operation();
33 }
34
35 }
36 void Composite::Add( Component* com)
37 {
38 comVec.push_back(com);
39 }
40 void Composite::Remove( Component* com)
41 {
42 for (vector<Component*>::iterator it = comVec.begin() ; it != comVec.end() ;)
43 {
44 if (com == *it)
45 {
46 it = comVec.erase(it);
47 }
48 else
49 {
50 it++;
51 }
52 }
53 }
54
55 Component* Composite::GetChild(int index)
56 {
57 return comVec[index] ;
58 }


 1 ////////////////////Leaf.h///////////////////////
2 #pragma once
3 #include "Component.h"
4 #include <iostream>
5 #include <string>
6 using namespace std;
7 class Leaf : public Component
8 {
9 public:
10 Leaf(const string&);
11 ~Leaf();
12 void Operation();
13 protected:
14 private:
15 string _name;
16 };
17
18 Leaf::Leaf(const string& name)
19 {
20 _name = name ;
21 }
22 Leaf::~Leaf()
23 {
24
25 }
26 void Leaf::Operation()
27 {
28 cout<<"Leaf operation : "<< _name <<endl;
29 }


 1 /////////////////main////////////////////////////
2 #include "Component.h"
3 #include "Composite.h"
4 #include "Leaf.h"
5 #include <iostream>
6 #include <string>
7 using namespace std;
8
9 int main()
10 {
11 Component* leaf1 = new Leaf("leaf1") ;
12 Component* leaf2 = new Leaf("leaf2") ;
13 Component* leaf3 = new Leaf("leaf3") ;
14 Component* com1 = new Composite("Com1");
15 com1->Add(leaf1);
16 com1->Add(leaf2);
17 com1->Add(leaf3);
18
19 Component* leaf4 = new Leaf("leaf4") ;
20 Component* leaf5 = new Leaf("leaf5") ;
21 Component* com2 = new Composite("Com2");
22 com2->Add(leaf4);
23 com2->Add(leaf5);
24
25 com1->Add(com2);
26
27 com1->Operation();
28
29 getchar();
30 return 0;
31 }

时间: 2024-10-11 16:04:51

Composite 模式的实现的相关文章

C++设计模式实现--组合(Composite)模式

一. 举例 这个例子是书上的,假设有一个公司的组结结构如下: 它的结构很像一棵树,其中人力资源部和财务部是没有子结点的,具体公司才有子结点. 而且最关健的是,它的每一层结构很相似. 代码实现如下: #include <iostream> #include <list> #include <string> using namespace std; //公司类,提供接口 class Company { public: Company(string name) { m_nam

Java组合模式(Composite模式)

Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树形结构图.组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行.可以用牵一动百来形容. 所以Composite模式使用到Iterator模式,和Chain of Responsibilit

Java 实现组合(Composite)模式

类图 /** * 树 整体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(String name) { this.root = new TreeNode(name); } public TreeNode getRoot() { return root; } } /** * 树节点 部份 * 也可以自身代表树:一堆节点组成了一颗树 * * @author stone * */

Android与设计模式——组合(Composite)模式

定义(GoF<设计模式>):将对象组合成树形结构以表示"部分整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性.  涉及角色 1.Component:(View)是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为.声明一个接口用于访问和管理Component子部件. 2.Leaf:(TextView.自定义View)在组合中表示叶子结点对象,叶子结点没有子结点(即不能在View内再添加View). 3.Composite:(ViewGr

Composite模式 组合模式

Android的ViewGroup 和 View 的关系,即是采用组合模式 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件和文件夹目录 2.问题 我们可以使用简单的对象组合成复杂的对象,而这个复杂对象有可以组合成更大的对象.我们可以把简单这些对象定义成类,然后定义一些容器类来存储这些简单对象.客户端代码必须区别对象简单对象和容器对象,而实际上大多数情况下用户认为它们是一样的.对这些类区别使用,使得程序更加复杂.递归使用

Composite模式

在开发时,如果遇到使用递归构建树状的组合结构,那么可以考虑使用Composite模式.Composite模式将对象组合成树形结构,来表示部分.整体的层次结构. 其类结构如图所示: 在Component中声明了所有管理子类对象的方法,因此实现Component接口的子类都有了Add.Remove等功能,这样叶子节点和枝节点对于外界没有区别:但是因为Leaf类本身不具备Add.Remove等功能,实现也没有意义. 在实现时,管理叶子节点需要容器,这里使用了vector. //Component.h

Structual设计--Composite模式

1.意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2.别名 无 3.动机 在绘图编辑器和图形捕捉系统这样的图形应用程序中,用户可以使用简单的组件创建复杂的图表.用户可以组合多个简单组件以形成一些较大的组件,这些组件又可以组合成更大的组件.一个简单的实现方法是为Text和Line这样的图元定义一些类,另外定义一些类作为这些图元的容器类(Container). 然而存在一个问题:使用这些类的代码必需区别对待图元对

二十三种设计模式之:组合(Composite)模式(部分&#183;整体模式)

组合(Composite)模式又叫部分·整体模式,主要用于实现树形结构. 例子如下: public class TreeNode{ private TreeNode parent; private String name; private List<TreeNode> children = new Arraylist<TreeNode>(); public TreeNode(String name){ this.name = name; } public String getNam

设计模式:Composite模式

设计模式:组合(Composite)模式 一.前言   关于Composite模式,其实就是组合模式,又叫部分整体模式,这个模式在我们的生活中也经常使用,比如说如果读者有使用Java的GUI编写过程序的,肯定少不了定义一些组件,初始化之后,然后使用容器的add方法,将这些组件有顺序的组织成一个界面出来:或者读者如果编写过前端的页面,肯定使用过<div>等标签定义一些格式,然后格式之间互相组合,通过一种递归的方式组织成相应的结构.这种方式其实就是组合,将部分的组件镶嵌到整体之中.那么凭什么可以这

Composite模式(组合设计模式)

Composite 设计模式? 在计算机的文件系统中,有"文件夹"的概念(在有些操作系统(Linux操作系统)中,也称为"目录").文件夹里面既可以放入文件,也可以放入其他文件夹(子文件夹).在子文件夹中,一样地既可以放入文件,也可以放入子文件夹.可以说,文件夹是形成了一种容器结构.递归结构. 结构模式:能够使容器与内容具有一致性,创造出递归结构的模式就是Composite模式. 关注点:使用Composite模式可以使容器与内容具有一致性,也可以称其为多个和单个的