C++设计模式-Component

C++设计模式-Component
意图:
将对象组合成树形结构以表示部分整体的层次结构。Composite使得用户对单一对象和组合对象的使用具有一致性
UML图:
C++设计模式-Component_第1张图片
解析:
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;
}

你可能感兴趣的:(C++设计模式-Component)