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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值