W poniższej implementacji wzorca projektowego kompozyt
- Compoment
odpowiada dowolnemu elementowi w hierarchii zaś
- Composite
agreguje elementy typu Compoment
.
https://pl.wikipedia.org/wiki/Kompozyt_(wzorzec_projektowy)
Zadanie:
1. W istniejącej implementacji w strukurze jako elementy wstawiane są obiekty typu Component
.
Należy klasę Compoment
uczynić klasą wirtualną a jako element wstawiany należy zaproponować inny typ dodając go do hierarchii.
2. Proszę zwrócić uwagę na to w jakiej kolejności niszczone są poszczególne obiekty wypisując odpowiednią informację na ekranie.
Co można powiedzieć o tym w jaki sposób obiekty są niszczone ?
3. Należy napisać metodę pozwalającą na wyszukiwanie w danej strukturze elementu o zadanej nazwie.
(Co w przypadku gdyby było ich więcej niż 1)
#include
#include
#include
class Component
{
std::string name_;
protected:
constexpr static const char* indentation_increment = " ";
public:
virtual void display(std::string indentation)
{
std::cout << indentation << "--" << name_ << std::endl;
}
Component(const std::string& name) : name_(name) {}
};
class Composite : public Component
{
std::vector> components_;
public:
virtual void display(std::string indentation) override
{
Component::display(indentation);
for (auto& c : components_)
c->display(indentation + indentation_increment);
}
public:
Composite(const std::string& name) : Component(name) {}
void addComponent(const std::shared_ptr& c)
{
components_.push_back(c);
}
};
int main(void)
{
auto L1A = std::make_shared("dir 1");
L1A->addComponent(std::make_shared("file 1"));
L1A->addComponent(std::make_shared("file 2"));
L1A->addComponent(std::make_shared("file 3"));
auto L1B = std::make_shared("dir 2");
L1B->addComponent(std::make_shared("file 4"));
auto L1C = std::make_shared("dir 3");
auto L2A = std::make_shared("dir 4");
L2A->addComponent(L1A);
L2A->addComponent(L1B);
L2A->addComponent(L1C);
L2A->addComponent(std::make_shared("file 5"));
L2A->display("");
return 0;
}