본문 바로가기

PROGRAMMING/Design Pattern

[GoF] 컴포지트 (Composite) 패턴

컴포지트 (Composite) 패턴 구조 패턴

복합 객체가 동일하게 취급할 수 있는 복수의 단일 객체에 대한 트리 구조를 형성하며, 단일 객체와 동일한 인터페이스를 클라이언트에게 제공합니다.



컴포지트(Composite)는 합성이라는 개념을 의미하는데, 컴포지트 패턴에서는 여러 객체의 합성을 제어할 수 있도록 하는 객체를 정의한다. 이것은 우리가 운영체제에서 자주 접하는 폴더와 파일의 개념에서 예로 들 수가 있다.

파일은 일련의 정보를 저장하기 위한 최소의 단위이고 폴더는 다수의 파일을 관리하기 용이하도록 분류하는 네임스페이스이다. 이와 같이 둘은 서로 다른 개념이지만, 폴더는 파일과 같이 용량을 확인할 수가 있으며 파일과 달리 내부 파일들의 용량의 합을 용량으로 보여준다. 파일의 집합을 관리하는 폴더가 용량이라는 파일의 구성 요소를 같이 정의한다는 것, 이것이 컴포지트 패턴의 핵심이다.

컴포지트 패턴에서는 단일 객체와, 다수의 단일 객체를 참조하여 일대다 관계를 형성하는 복합 객체 또는 컴포지트(Composite), 그리고 이 둘이 공통으로 가지는 인터페이스인 컴포넌트(Component)로 구성된다. 복합 객체로부터 단일 객체에 대한 부분-전체 계층 구조가 형성되어, 복합 객체가 동일한 인터페이스 하에 단일 객체와 구분없이 같은 작업을 수행할 수 있다.

컴포지트 패턴을 이용하면 클라이언트는 다수의 단일 객체에 일일히 대응하지 않아도 복합 객체를 통해 간단하고 일관된 접근을 할 수 있게 되고, 새로운 단일 객체의 추가 또한 용이해진다. 이는 코드를 더 간략하게 하며 코드의 가독성이 향상된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class PatternComposite
{
    public interface IComponent
    {
        void Operation();
    }
 
    public class Composite : IComponent
    {
        private List<IComponent> _components;
 
        public Composite()
        {
            _components = new List<IComponent>();
        }
 
        public void Operation()
        {
            foreach (IComponent component in _components)
            {
                component.Operation();
            }
        }
 
        public void Add(IComponent component)
        {
            _components.Add(component);
        }
    }
 
    public class Leaf : IComponent
    {
        private string _name;
 
        public Leaf(string name)
        {
            _name = name;
        }
 
        public void Operation()
        {
            Console.WriteLine("Operating " + _name);
        }
    }
 
    public static void Main(string[] args)
    {
        Composite composite = new Composite();
 
        composite.Add(new Leaf("Leaf A"));
        composite.Add(new Leaf("Leaf B"));
        composite.Add(new Leaf("Leaf C"));
        composite.Add(new Leaf("Leaf D"));
 
        IComponent component = composite;
 
        component.Operation();
    }
}
cs

1
2
3
4
5
Operating Leaf A
Operating Leaf B
Operating Leaf C
Operating Leaf D
Press any key to continue . . .
cs

Composite 객체는 Leaf 객체 4개를 묶어 트리 구조를 형성하였고, Composite 객체를 통해 Operation() 함수를 호출했을 경우에 Composite 객체가 가지고 있는 Leaf 객체들에게 Operation() 함수를 일관하게 호출하였다.

'PROGRAMMING > Design Pattern' 카테고리의 다른 글

[GoF] 파사드 (Facade) 패턴  (0) 2019.03.09
[GoF] 데코레이터 (Decorator) 패턴  (0) 2019.03.09
[GoF] 브릿지 (Bridge) 패턴  (0) 2019.03.09
[GoF] 프록시 (Proxy) 패턴  (0) 2019.03.09
[GoF] 어댑터 (Adapter) 패턴  (0) 2019.03.09