Skip to main content

[Design Pattern] 구조 패턴 6. 컴포지트 (Composite)




컴포지트 (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)



References #