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에 추가하고 그려줍니다.
아래의 실행 결과를 보시면 원하는 출력 결과가 나옴을 확인하실 수 있습니다.
일반적으로 꽤 사용되는 패턴인거 같습니다.
어떠한 트리구조를 표현할 때 사용되기 때문이죠 알아두면 유용합니다.
'Design Pattern' 카테고리의 다른 글
[Design Pattern] 19. Singleton Pattern(싱글톤 패턴) C# (0) | 2023.04.08 |
---|---|
[Design Pattern] 18. Decorator Pattern(데코레이터 패턴) C# (0) | 2023.04.07 |
[Design Pattern] 16. Proxy Pattern(프록시 패턴) C# (0) | 2023.04.05 |
[Design Pattern] 15. Flyweight Pattern(플라이웨이트 패턴) C# (0) | 2023.04.04 |
[Design Pattern] 14. Bridge Pattern(브릿지 패턴) C# (0) | 2023.04.03 |