#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Component
{
public:
Component() {}
Component(string strName) : m_strName(strName) {}
void setName(string strName) { m_strName = strName; }
virtual void addComponent(Component* pobjComponent) = 0;
virtual void removeComponent(Component* pobjComponent) = 0;
virtual void show(const int& depth) = 0;
protected:
string m_strName = "";
};
class Leaf : public Component
{
public:
Leaf() {}
Leaf(string strName) : Component(strName) {}
virtual void addComponent(Component* pobjComponent) override {}
virtual void removeComponent(Component* pobjComponent) override {}
virtual void show(const int& depth) override
{
cout << string(depth, '-') << m_strName << endl;
}
};
class Composite : public Component
{
public:
Composite() {}
Composite(string strName) : Component(strName) {}
virtual void addComponent(Component* pobjComponent) override
{
m_vecComponent.push_back(pobjComponent);
}
virtual void removeComponent(Component* pobjComponent) override
{
for (auto it = m_vecComponent.begin(); it != m_vecComponent.end(); ++it)
{
if (*it == pobjComponent)
{
m_vecComponent.erase(it);
break;
}
}
}
virtual void show(const int& depth) override
{
cout << string(depth, '-') << m_strName << endl;
for (auto& it : m_vecComponent)
{
it->show(depth + 1);
}
}
private:
vector<Component*> m_vecComponent;
};
int main()
{
Composite* pobjRootComposite = new Composite("root");
Leaf* pobjLeafOne = new Leaf("leafOne");
pobjRootComposite->addComponent(pobjLeafOne);
Composite* pobjLeafComposite = new Composite("leafComposite");
pobjRootComposite->addComponent(pobjLeafComposite);
Leaf* pobjLeafTwo = new Leaf("leafTwo");
pobjLeafComposite->addComponent(pobjLeafTwo);
pobjRootComposite->show(1);
return 0;
}
总结:体现部分与整体层次的结构,可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象
组合模式
最新推荐文章于 2025-01-28 15:05:02 发布