蜗牛的家
男儿当自强
posts - 48,  comments - 21,  trackbacks - 0
意图:
将对象组合成树形结构以表示部分整体的层次结构。Composite使得用户对单一对象和组合对象的使用具有一致性
UML图:

解析:
Component模式是为解决组件之间的递归组合提供了解决的办法,其中leaf是叶子节点也就是不含子组件的节点,而Composite是含有子组件的类。在UI的设计中,最基本的控件是诸如Button,Edit这样的控件,相当于是这里的Leaf组件,而比较复杂的控件比如List则可也看做是由这些基本的组件组合起来的控件,相当于这里的Composite,它们之间有一些行为含义是相同的,比如在控件上作一个点击,移动操作等等的,这些都可以定义为抽象基类中的接口虚函数,由各个派生类去实现之,这些都会有的行为就是这里的Operation函数,而添加,删除等进行组件组合的操作只有非叶子结点才可能有,所以虚拟基类中只是提供接口而且默认的实现是什么都不做.
//test.h
//////////////////////////////////////////////////////////////////////////
#include <list>

class Component
{
public:
    Component()
{}
    
virtual ~Component(){}
    
    
//纯虚函数,只提供接口,没有默认的实现
    virtual void Operation() = 0;
    
    
//虚函数,提供接口,默认实现是什么都不做
    virtual void Add(Component* pChild);
    
virtual void Remove(Component* pChild);
    
virtual Component* GetChild(int nIndex);
}
;

//派生自Component,子叶组件的基类
class Leaf : public Component
{
public:
    Leaf()
{}
    
virtual ~Leaf(){}
    
    
virtual void Operation();
}
;

//派生自Component,含有子叶组件的基类
class Composite : public Component
{
public:
    Composite()
{}
    
virtual ~Composite();
    
    
virtual void Operation();
    
    
virtual void Add(Component* pChild);
    
virtual void Remove(Component* pChild);
    
virtual Component* GetChild(int nIndex);
private:
    std::list
<Component*> m_ListOfComponent;
}
;

// test.cpp : Defines the entry point for the console application.
//

#include 
"stdafx.h"
#include 
"test.h"
#include 
<iostream>
#include 
<algorithm>

using namespace std;
//////////////////////////////////////////////////////////////////////////
void Component::Add(Component* pChild)
{
}

void Component::Remove(Component* pChild)
{
}

Component
* Component::GetChild(int nIndex)
{
    
return NULL;
}

//////////////////////////////////////////////////////////////////////////
void Leaf::Operation()
{
    cout 
<< "Operation of leaf\n";    
}

//////////////////////////////////////////////////////////////////////////
Composite::~Composite()
{
    std::list
<Component*>::iterator iter1,iter2,temp;
    
    
for (iter1 = m_ListOfComponent.begin(),iter2 = m_ListOfComponent.end(); iter1 != iter2; ++iter1)
    
{
        temp 
= iter1;
        delete(
*temp);
    }

}


void Composite::Add(Component* pChild)
{
    m_ListOfComponent.push_back(pChild);
}


void Composite::Remove(Component* pChild)
{
    std::list
<Component*>::iterator iter;
    iter 
= find(m_ListOfComponent.begin(),m_ListOfComponent.end(),pChild);
    
    
if (m_ListOfComponent.end() != iter)
    
{
        m_ListOfComponent.erase(iter);
    }

}


Component
* Composite::GetChild(int nIndex)
{
    
if (nIndex <= 0||nIndex > m_ListOfComponent.size())
    
{
        
return NULL;
    }

    std::list
<Component*>::iterator iter1,iter2;
    
int i;
    
for (i=1, iter1 = m_ListOfComponent.begin(),iter2 = m_ListOfComponent.end(); iter1 != iter2; ++iter1, ++i)
    
{
        
if (i == nIndex)
        
{
            
break;
        }

    }

    
return *iter1;
}


void Composite::Operation()
{
    cout 
<< "Operation of Composite\n";
    list
<Component*>::iterator iter1,iter2;
    
for (iter1 = m_ListOfComponent.begin(),iter2 = m_ListOfComponent.end(); iter1 != iter2; ++iter1)
    
{
        (
*iter1)->Operation();
    }

}

//////////////////////////////////////////////////////////////////////////
int main(int argc, char* argv[])
{
    Leaf 
*pleaf1 = new Leaf;
    Leaf 
*pleaf2 = new Leaf;
    
    Composite 
*pComposite = new Composite;
    pComposite
->Add(pleaf1);
    pComposite
->Add(pleaf2);
    pComposite
->Operation();
    pComposite
->GetChild(2)->Operation();
    
    delete pComposite;
    
    system(
"pause");
    
return 0;
}

posted on 2008-08-18 12:22 黑色天使 阅读(1759) 评论(0)  编辑 收藏 引用 所属分类: 设计模式

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2009年1月>
28293031123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(2)

随笔分类

随笔档案

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜