组合模式
组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构,表征了一种相似对象的树形组织形式;其特点是,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦;
c++实现:
/*************************************************************************
> File Name: composite.cpp
> Author: XXDK
> Email: v.manstein@qq.com
> Created Time: Tue 09 Oct 2018 03:35:40 PM CST
************************************************************************/
#include<iostream>
#include<vector>
using namespace std;
class Component
{
public:
Component(std::string name) : name_(name) {}
virtual ~Component() {}
virtual void Add(Component* cp) = 0;
virtual void Remove(Component* cp) = 0;
virtual Component* GetChild(int index) = 0;
virtual void Operation(int indent) = 0;
private:
Component();
protected:
std::string name_;
};
class File : public Component
{
public:
File(std::string name) : Component(name) {}
virtual ~File() {}
void Add(Component* cp) {
std::cout << "invalid add operation." << std::endl;
}
void Remove(Component* cp) {
std::cout << "invalid remove operation." << std::endl;
}
Component* GetChild(int index) {
std::cout << "Can't get child from file'" << std::endl;
return NULL;
}
void Operation(int indent) {
std::string str(indent, '-');
std::cout << str << " " << name_ << std::endl;
}
private:
File();
};
class Folder : public Component
{
public:
Folder(std::string name) : Component(name) {}
virtual ~Folder() {
while (!elements_.empty()) {
std::vector<Component*>::iterator it = elements_.begin();
if (*it) {
delete *it, *it = NULL;
}
elements_.erase(it);
}
}
void Add(Component* cp) {
elements_.push_back(cp);
}
void Remove(Component* cp) {
std::vector<Component*>::iterator it = elements_.begin();
while (it != elements_.end()) {
if (*it == cp) {
delete *it, *it = NULL;
elements_.erase(it);
break;
}
++it;
}
}
Component* GetChild(int index) {
if (index >= elements_.size()) {
return NULL;
}
return elements_[index];
}
void Operation(int indent) {
std::string str(indent, '-');
std::cout << str << "+ " << name_ << std::endl;
std::vector<Component*>::iterator it = elements_.begin();
while (it != elements_.end()) {
(*it)->Operation(indent + 4);
++it;
}
}
private:
Folder();
std::vector<Component*> elements_;
};
int main()
{
Component* pRoot = new Folder("/home/xxdk/");
pRoot->Add(new File("README"));
pRoot->Add(new File("Log"));
Component* pVideo = new Folder("video/");
pVideo->Add(new File("The Expendables"));
pVideo->Add(new File("Tears of the Sun"));
pRoot->Add(pVideo);
Component* pAudio = new Folder("audio/");
pAudio->Add(new File("Gee"));
pAudio->Add(new File("Genie"));
pRoot->Add(pAudio);
Component* pPicture = new Folder("picture/");
pPicture->Add(new File("Flower"));
pPicture->Add(new File("Grass"));
pRoot->Add(pPicture);
pRoot->Operation(0);
delete pRoot, pRoot = NULL;
return 0;
}