320x100
구조
#pragma once
#include <iostream>
#include <vector>
#include <string>
class IComponent
{
public:
virtual void Operation() = 0;
};
class Composite : public IComponent
{
Composite()
{
}
void Operation() override
{
for (IComponent* component : components_)
{
component->Operation();
}
}
void Add(IComponent* component)
{
components_.push_back(component);
}
private:
std::vector<IComponent*> components_;
};
class Leaf : public IComponent
{
public:
Leaf(std::string&& name)
{
name_ = name;
}
void Operation() override
{
std::cout << "Operating " << name_ << std::endl;
}
private:
std::string name_;
};
사용
int main()
{
Composite* composite = new Composite;
composite->Add(new Leaf(std::string("Leaf A")));
composite->Add(new Leaf(std::string("Leaf B")));
composite->Add(new Leaf(std::string("Leaf C")));
composite->Add(new Leaf(std::string("Leaf D")));
IComponent* component = composite;
component->Operation();
return 0;
}
컴포지트 패턴에서는 단일 객체(Leaf)와, 다수의 단일 객체를 참조하여 일대다 관계를 형성하는 복합 객체 또는 컴포지트(Composite), 그리고 이 둘이 공통으로 가지는 인터페이스인 컴포넌트(Component)로 구성된다. 복합 객체로부터 단일 객체에 대한 부분-전체 계층 구조가 형성되어, 복합 객체가 동일한 인터페이스 하에 단일 객체와 구분없이 같은 작업을 수행할 수 있다.
컴포지트 패턴을 이용하면 클라이언트는 다수의 단일 객체에 일일히 대응하지 않아도 복합 객체를 통해 간단하고 일관된 접근을 할 수 있게 되고, 새로운 단일 객체의 추가 또한 용이해진다. 이는 코드를 더 간략하게 하며 코드의 가독성이 향상된다.
파일은 일련의 정보를 저장하기 위한 최소의 단위이고 폴더는 다수의 파일을 관리하기 용이하도록 분류하는 네임스페이스이다. 이와 같이 둘은 서로 다른 개념이지만, 폴더는 파일과 같이 용량을 확인할 수가 있으며 파일과 달리 내부 파일들의 용량의 합을 용량으로 보여준다. 파일의 집합을 관리하는 폴더가 용량이라는 파일의 구성 요소를 같이 정의한다는 것, 이것이 컴포지트 패턴의 핵심이다.
320x100
'프로그래밍 > GoF' 카테고리의 다른 글
[구조 패턴] - 파사드(Facade) (0) | 2022.01.11 |
---|---|
[구조 패턴] - 데코레이터(Decorator) (0) | 2022.01.11 |
[구조 패턴] - 브릿지(Bridge) (0) | 2022.01.10 |
[구조 패턴] - 어댑터(Adapter) (0) | 2022.01.10 |
[행동 패턴] - 템플릿 메서드(Template method) (0) | 2022.01.09 |