码迷,mamicode.com
首页 > 其他好文 > 详细

Composite模式

时间:2015-07-14 11:43:46      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:设计模式   组合模式   composite   

在开发时,如果遇到使用递归构建树状的组合结构,那么可以考虑使用Composite模式。Composite模式将对象组合成树形结构,来表示部分、整体的层次结构。

其类结构如图所示:
技术分享
在Component中声明了所有管理子类对象的方法,因此实现Component接口的子类都有了Add、Remove等功能,这样叶子节点和枝节点对于外界没有区别;但是因为Leaf类本身不具备Add、Remove等功能,实现也没有意义。

在实现时,管理叶子节点需要容器,这里使用了vector。

//Component.h

//Component.h

#ifndef _COMPONENT_H_
#define _COMPONENT_H_

class Component
{
public:
    Component();
    virtual ~Component();
    virtual void Operation() = 0;
    virtual void Add(const Component&);
    virtual void Remove(const Component&);
    virtual Component* GetChild(int);
};

#endif

//Component.cpp

//Component.cpp

#include"Component.h"

Component::Component(){}
Component::~Component(){}
void Component::Add(const Component& com)
{}
void Component::Remove(const Component& com)
{}
Component* Component::GetChild(int index)
{
    return 0;
}

//Composite.h

//Composite.h

#ifndef _COMPOSITE_H_
#define _COMPOSITE_H_

#include"Component.h"
#include<vector>

class Composite :public Component
{
public:
    Composite();
    ~Composite();

    void Operation();
    void Add(Component* com);
    void Remove(Component* com);
    Component* GetChild(int index);
private:
    std::vector<Component*> comVec;
};

#endif

//Composite.cpp

//Composite.cpp

#include"Component.h"
#include"Composite.h"

Composite::Composite()
{

}

Composite::~Composite()
{

}

void Composite::Operation()
{
    std::vector<Component*>::iterator comIter = comVec.begin();
    for (; comIter != comVec.end(); comIter++)
    {
        (*comIter)->Operation();
    }
}

void Composite::Add(Component* com)
{
    comVec.push_back(com);
}

void Composite::Remove(Component* com)
{
    std::vector<Component*>::iterator comIter = comVec.begin();
    for (; comIter != comVec.end(); comIter++)
    {
        if (*comIter == com)
        {
            comVec.erase(comIter);
            return;
        }

    }

}

Component* Composite::GetChild(int index)
{
    return comVec[index];
}

//Leaf.h

//Leaf.h

#ifndef _LEAF_H_
#define _LEAF_H_
#include"Component.h"

class Leaf :public Component
{
public:
    Leaf();
    ~Leaf();
    void Operation();

};
#endif

//Leaf.cpp

//Leaf.cpp

#include"Leaf.h"
#include<iostream>

Leaf::Leaf()
{}
Leaf::~Leaf()
{}
void Leaf::Operation()
{
    std::cout << "Leaf operation..." << std::endl;
}

//main.cpp

//main.cpp

#include"Component.h"
#include"Composite.h"
#include"Leaf.h"
int main()
{
    Leaf* l = new Leaf();
    l->Operation();

    Composite *com = new Composite();
    com->Add(l);
    com->Operation();
    Component* ll = com->GetChild(0);
    ll->Operation();
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

Composite模式

标签:设计模式   组合模式   composite   

原文地址:http://blog.csdn.net/kangroger/article/details/46869005

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!