본문 바로가기

Design Pattern

[Design Pattern] 17. Composite Pattern(컴포지트 패턴) C#

728x90

객체의 계층 구조를 표현하고 개별 객체와 객체 그룹을 균일하게 처리해야 하는 상황을 도와주는 패턴입니다

 

구조 패턴(Structural Design Patterns)중 하나이죠.

 

장점

  • 다형성과 재귀를 사용해 복잡한 트리 구조들과 더 편리하게 작업할 수 있습니다.
  • 개방/폐쇄 원칙을 만족하며 코드를 크게 변경하지 않고 새로운 요소를 추가할 수 있습니다.

단점

  • 기능이 크게 다른 클래스들의 경우 공통 인터페이스를 제공하기 어려우며, 어떤 경우에는 컴포넌트 인터페이스를 과도하게 일반화해야 하여 이해하기 어렵게 만들 수 있습니다.

 

C#으로 Console 프로젝트를 하나 생성해서 할 것입니다.

 

목표는 Circle, Square을 그려보겠습니다.

 

프로젝트의 tree구조는 아래와 같습니다.

Composite (Project)

|- Program.cs (Main)

|- IShape.cs (Component interface)

|- Circle.cs (Leaf class)

|- Square.cs (Leaf class)

|- Drawing.cs (Composite class)

 

 

IShape.cs

namespace Composite
{
    public interface IShape
    {
        void Draw();
    }
}

공통 인터페이스로서 Draw메소드를 구성해줍니다.

Circle.cs

using System;

namespace Composite
{
    public class Circle : IShape
    {
        public void Draw()
        {
            Console.WriteLine("Drawing circle");
        }
    }
}

IShape을 구현해줍니다.

Square.cs

using System;

namespace Composite
{
    public class Square : IShape
    {
        public void Draw()
        {
            Console.WriteLine("Drawing square");
        }
    }
}

Square도 동일하게 구현해줍니다.

Drawing.cs

using System.Collections.Generic;

namespace Composite
{
    public class Drawing : IShape
    {
        private List<IShape> _shapes = new List<IShape>();

        public void AddShape(IShape shape)
        {
            _shapes.Add(shape);
        }

        public void RemoveShape(IShape shape)
        {
            _shapes.Remove(shape);
        }

        public void Draw()
        {
            foreach (IShape shape in _shapes)
            {
                shape.Draw();
            }
        }
    }
}

Drawing이라는 Class를 만들어 IShaoe들을 처리하게 만들어 줍니다.

Program.cs

namespace Composite
{
    class Program
    {
        static void Main(string[] args)
        {
            IShape circle = new Circle();
            IShape square = new Square();
            Drawing drawing = new Drawing();
            drawing.AddShape(circle);
            drawing.AddShape(square);
            drawing.Draw();
        }
    }
}

이전에 만든 Circle, Square과 Drawing을 만든 뒤 drawing에 추가하고 그려줍니다.

아래의 실행 결과를 보시면 원하는 출력 결과가 나옴을 확인하실 수 있습니다.

실행 결과

일반적으로 꽤 사용되는 패턴인거 같습니다.

어떠한 트리구조를 표현할 때 사용되기 때문이죠 알아두면 유용합니다.