[Design Pattern] 구조 패턴 6. 컴포지트 (Composite)
Table of Contents
컴포지트 (Composite) #
- 부분과 전체를 나타내는 계층구조(트리)를 사용해서, 클라이언트가 개별 객체와 복합 객체를 똑같은 방법으로 다룰 수 있게 한다.
개념적인 예시 #
abstract class Component
{
public Component() { }
public abstract string Operation();
public virtual void Add(Component component)
{
throw new NotImplementedException();
}
public virtual void Remove(Component component)
{
throw new NotImplementedException();
}
public virtual bool IsComposite()
{
return true;
}
}
// 자식이 없는 단일 객체와
class Leaf : Component
{
public override string Operation()
{
return "Leaf";
}
public override bool IsComposite()
{
return false;
}
}
// 자식이 있는 복합 객체를 똑같은 방식으로 다룰 수 있다.
class Composite : Component
{
protected List<Component> _children = new List<Component>();
public override void Add(Component component)
{
this._children.Add(component);
}
public override void Remove(Component component)
{
this._children.Remove(component);
}
// 재귀적으로 실행된다.
public override string Operation()
{
int i = 0;
string result = "Branch(";
foreach (Component component in this._children)
{
result += component.Operation();
if (i != this._children.Count - 1)
{
result += "+";
}
i++;
}
return result + ")";
}
}
class Client
{
public void ClientCode(Component leaf)
{
Console.WriteLine($"RESULT: {leaf.Operation()}\n");
}
public void ClientCode2(Component component1, Component component2)
{
if (component1.IsComposite())
{
component1.Add(component2);
}
Console.WriteLine($"RESULT: {component1.Operation()}");
}
}
class Program
{
static void Main(string[] args)
{
Client client = new Client();
// 단일 객체 다루기
Leaf leaf = new Leaf();
client.ClientCode(leaf);
// 복합 객체 다루기
Composite tree = new Composite();
Composite branch1 = new Composite();
branch1.Add(new Leaf());
branch1.Add(new Leaf());
Composite branch2 = new Composite();
branch2.Add(new Leaf());
tree.Add(branch1);
tree.Add(branch2);
client.ClientCode(tree);
client.ClientCode2(tree, leaf);
}
}
RESULT: Leaf
RESULT: Branch(Branch(Leaf+Leaf)+Branch(Leaf))
RESULT: Branch(Branch(Leaf+Leaf)+Branch(Leaf)+Leaf)