实现要点:

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

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

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

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

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

使用场景:

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

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

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


  /////////////////Component.h////////////////////////
 #pragma once
class Component
{
public:
virtual ~Component();
Component();
virtual void Operation() = ;
virtual void Add( Component*);
virtual void Remove( Component*);
virtual Component* GetChild(int);
protected:
private:
};
 /////////////////Component.cpp////////////////////////
#include "Component.h"
Component::Component()
{ }
Component::~Component()
{ }
void Component::Add( Component* com)
{ } void Component::Remove( Component* com)
{ }
void Component::Operation()
{ }
Component* Component::GetChild(int index)
{
return ;
}
 /////////////////Composite.h////////////////////////
#pragma once
#include "Component.h"
#include <vector>
using namespace std;
class Composite : public Component
{
public:
Composite(const string&);
~Composite();
void Operation() ;
void Add( Component*);
void Remove( Component*);
Component* GetChild(int);
protected:
private:
vector<Component*> comVec ;
string _name ;
};
 /////////////////Composite.cpp////////////////////////
#include "Composite.h"
#include "Component.h"
#include <iostream>
#include <string>
using namespace std; Composite::Composite(const string& name)
{
_name = name ;
}
Composite::~Composite()
{ }
void Composite::Operation()
{
cout<<"Composite operation : "<<_name<<endl;
vector<Component*>::iterator iter = comVec.begin();
for (;iter != comVec.end() ; iter++)
{ if (_name == "Com2")
{
cout<<"------";
}
if (_name == "Com1")
{
cout<<"---";
} (*iter)->Operation();
} }
void Composite::Add( Component* com)
{
comVec.push_back(com);
}
void Composite::Remove( Component* com)
{
for (vector<Component*>::iterator it = comVec.begin() ; it != comVec.end() ;)
{
if (com == *it)
{
it = comVec.erase(it);
}
else
{
it++;
}
}
} Component* Composite::GetChild(int index)
{
return comVec[index] ;
}
 ////////////////////Leaf.h///////////////////////
#pragma once
#include "Component.h"
#include <iostream>
#include <string>
using namespace std;
class Leaf : public Component
{
public:
Leaf(const string&);
~Leaf();
void Operation();
protected:
private:
string _name;
}; Leaf::Leaf(const string& name)
{
_name = name ;
}
Leaf::~Leaf()
{ }
void Leaf::Operation()
{
cout<<"Leaf operation : "<< _name <<endl;
}
 /////////////////main////////////////////////////
#include "Component.h"
#include "Composite.h"
#include "Leaf.h"
#include <iostream>
#include <string>
using namespace std; int main()
{
Component* leaf1 = new Leaf("leaf1") ;
Component* leaf2 = new Leaf("leaf2") ;
Component* leaf3 = new Leaf("leaf3") ;
Component* com1 = new Composite("Com1");
com1->Add(leaf1);
com1->Add(leaf2);
com1->Add(leaf3); Component* leaf4 = new Leaf("leaf4") ;
Component* leaf5 = new Leaf("leaf5") ;
Component* com2 = new Composite("Com2");
com2->Add(leaf4);
com2->Add(leaf5); com1->Add(com2); com1->Operation(); getchar();
return ;
}

Composite 模式的实现的更多相关文章

  1. 组合模式/composite模式/对象结构型模式

    组合模式/composite模式/对象结构型 意图 将对象组合成树形结构以表示"整体--部分"的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 动机 C ...

  2. C++基础——模拟事务 (2)Composite模式

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  3. Composite模式

    1 意图:将对象组成树形结构,以表示“部分——整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 2 动机:同意处理图元对象和包含图元的容器对象.Composite通过 ...

  4. Java 实现组合(Composite)模式

    类图 /** * 树 总体 * * @author stone * */ public class Tree { private TreeNode root; //根节点 public Tree(St ...

  5. 【结构型】Composite模式

    组合模式意在将对象组合成树形结构以表示部分与整体的层次结构关系,并且用户对单个对象的操作以有对组合对象的操作都是一致的.即:组合对象 is-a 单个对象,同时又可以组合着 n 个的单个对象(甚至于其他 ...

  6. (原创)composite模式和bridge模式是天生的好朋友

    composite模式的意图是:将对象组合成树形结构以表示“部分-整体”的层次结构.composite使得用户对单个对象和组合对象的使用具有一致性.它的类图如下: composite模式的实现分为透明 ...

  7. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树 ...

  8. 设计模式之——Composite模式

    composite模式又叫做组合模式/复合模式. 它是一种能够使容器与内容具有一致性,创造出递归结构的模式. 示例程序是列出文件夹以及其内部文件与文件夹一览的功能: 可以由示例图看出,有一个电影文件夹 ...

  9. Composite模式 组合模式

    Android的ViewGroup 和 View 的关系,即是采用组合模式 1. 概述 在数据结构里面,树结构是很重要,我们可以把树的结构应用到设计模式里面. 例子1:就是多级树形菜单. 例子2:文件 ...

  10. Composite模式(组合设计模式)

    Composite 设计模式? 在计算机的文件系统中,有"文件夹"的概念(在有些操作系统(Linux操作系统)中,也称为"目录").文件夹里面既可以放入文件,也 ...

随机推荐

  1. 【转】MFC下拉列表框的用法

    原文网址:http://blog.csdn.net/kinglimy/article/details/6452239 Combo Box (组合框)控件很简单,可以节省空间.从用户角度来看,这个控件是 ...

  2. 游戏开发设计模式之状态模式 & 有限状态机 & c#委托事件(unity3d 示例实现)

    命令模式:游戏开发设计模式之命令模式(unity3d 示例实现) 对象池模式:游戏开发设计模式之对象池模式(unity3d 示例实现) 原型模式:游戏开发设计模式之原型模式 & unity3d ...

  3. 学习嵌入式Linux有没有一个最佳的顺序(持续更新)

    作为一个嵌入式Linux的初学者,我知道我可能将长期处于初学者阶段,因为我至今仍然没有能够摸索出一条很好的道路让我由初学者进入到更高级阶段.但是我始终没有放弃,本篇文章就是用来记录我学习嵌入式Linu ...

  4. 【转】VS 代码行数统计

    [转自]http://www.cnblogs.com/JuneZhang/archive/2013/01/10/2854572.html VS用正则表达式统计代码行数 利用VS2010的查找功能和正则 ...

  5. Mac下搭建Eclipse Android开发环境

    之前一直是用windows搞android开发,但windows这个性能也真是让人醉了,终于一狠心,砸锅卖铁买了Mac.然后就开始在Mac上搭建android开发环境, 其实也不麻烦,关键是找准下载地 ...

  6. mac上的键盘生活——quicksliver

      昨天晚上一直在找mac上的博客客户端,没发现很好的国内支持客户端,却发现了一个新的东西--quicksliver 简单的说,这个就是个快捷键启动方式,这是我在mac上用的最好的一个快捷键启动程序( ...

  7. SWMM代码移植到64位平台

    在32位平台上运行SWMM模型,当节点数量到达60万以上的时候,模型运行占用内存接近1.85G的时候就会因为内存不够而无法计算.这种情况还是单独运行SWMM.exe的时候出现,如果采用SWMM.DLL ...

  8. Properties/Property文件读取(键值均)乱码问题!

    方法一:使用native2ascii进行转码,这个不做说明,客户不可能帮你转码的. 方法二:当键是因为时直接getProperty即可,但加载后的propertis对象里的键也是中文乱码,就无法通过g ...

  9. php 判断数组相等 数组运算符介绍

    如何判断两个数组相等呢?其实很简单,用 == 或者 === 就可以了 php手册里说明如下, 例子 名称 结果 $a + $b 联合 $a 和 $b 的联合. $a == $b 相等 如果 $a 和  ...

  10. 三大框架常遇的错误:hibernate : object references an unsaved transient instance

    hibernate : object references an unsaved transient instance 该错误是操作顺序的问题,比如: save或update顺序问题---比方学生表和 ...