컴포지트 패턴
객체들을 트리구조로 구성하여 부분-전체 계층 구조로 표현할수 있도록 하는 패턴
컴포지트 패턴은 특정 객체들이 다른 객체들을 포함할 수 있는 구조를 단순하고 유연하게 관리할 수 있다.
클라이언트가 개별 객체와 복합 객체를 구분하지 않고 똑같은 방법으로 다룰수 있게 해줌 → 투명성
복합 구조에 들어있는 것을 컴포넌트라 부르고, 컴포넌트에는 복합 객체와 개별 객체가 있음
복합 객쳬(Composite): 여러 개별 객체나 복합 객체를 자식으로 포함하는 객체
개별 객체(Leaf): 하위 요소를 갖지 않는 단일 객체
간단하게 똑같은 작업을 전체 메뉴 구조를 대상으로 반복(재귀)해서 적용 가능
클라이언트 코드를 단순화시킬 수 있음
클라이언트는 복합 객체를 사용하고 있는지, 개별 객체를 사용하고 있는지를 신경쓰지 않아도됨
즉, 여기저기 조건문을 작성하지 않아도 되고, 메소드 하나로 전체 구조의 반복문을 간단하게 실행 가능
컴포지트 패턴은 상황에 따라 투명성과 안전성 사이에서 적절한 균형을 찾아야함
컴포지트 패턴은 복합 객체와 개별 객체를 동일하게 다루기 위해서 단일 책임 원칙(계층구조 관리와 비즈니스 동작 2가지 책임을 포함)을 깨는 대신 투명성을 확보하는 패턴
클라이언트가 어떤 원소를 대상으로 부적절한 작업(필요없는 작업)을 처리하는 코드를 작성할 수 있게 됨
💡 자식원소가 있는 원소는 노드(node)라 부른다.
개별 객체와 복합 객체를 모두 담아둘 수 있는 구조를 제공
솔리드 원칙중 인터페이스 분리 원칙에 위배됨, 다만 실무에서는 클래스들의 일관성을 유지해야하거나, 시스템의 규모가 작을 떄 이렇게 작성하기도함
1. 컴포넌트 인터페이스
2. 리프 객체
3. 복합 객체
4. 클라이언트 코드
Last updated