每日博客

组合模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:

1、理解组合模式的动机,掌握该模式的结构;

2、能够利用组合模式解决实际问题。

 

 

[实验任务一]:组合模式

用透明组合模式实现教材中的“文件夹浏览”这个例子。

#include <iostream>
#include <string>
#include <list>
using namespace std;

class Component
{
protected:
string name;
public:
Component(string name)
:name(name)
{ }
virtual void AddComponent(Component *component) { }
virtual void RemoveComponent(Component *component) { }
virtual void GetChild(int depth) { }
};

class Leaf: public Component
{
public:
Leaf(string name)
:Component(name)
{ }
void AddComponent(Component *component)
{
cout<<"can't add"<<endl;
}
void RemoveComponent(Component *component)
{
cout<<"can't remove"<<endl;
}
void GetChild(int depth)
{
string _tmpstring(depth, '-');
cout<<_tmpstring<<name<<endl;
}
};

class Composite:public Component
{
private:
list<Component*> _componets;

public:
Composite(string name)
:Component(name)
{ }
void AddComponent(Component *component)
{
_componets.push_back(component);
}
void RemoveComponent(Component *component)
{
_componets.remove(component);
}
void GetChild(int depth)
{
string tmpstring (depth, '-');
cout<<tmpstring<<name<<endl;
list<Component*>::iterator iter = _componets.begin();
for(; iter != _componets.end(); iter++)
{
(*iter)->GetChild(depth + 2);
}
}
};

main()
{
Composite *root = new Composite("root");
Leaf *leaf1 = new Leaf("A");
Leaf *leaf2 = new Leaf("B");
root->AddComponent(leaf1);
root->AddComponent(leaf2);

Composite *lay2 = new Composite("AA");
Leaf *leaf4 = new Leaf("BB");
lay2->AddComponent(leaf4);

Composite *lay1 = new Composite("CC");
Leaf *leaf3 = new Leaf("C");
lay1->AddComponent(leaf3);
lay1->AddComponent(lay2);

root->AddComponent(lay1);

root->GetChild(1);
cout<<endl;
lay1->GetChild(1);
cout<<endl;
lay2->GetChild(1);

delete root;
delete lay1;
delete lay2;
delete leaf1;
delete leaf2;
delete leaf3;
delete leaf4;
}

posted @ 2021-10-24 19:02  谦寻  阅读(58)  评论(0编辑  收藏  举报