-
Composite Pattern(복합체 패턴)STUDY/디자인패턴 2024. 12. 25. 14:18
복합체 패턴이란?
객체들을 트리 구조들로 구성한 후, 이러한 구조들과 개별 객체들처럼 작업할 수 있도록 하는 구조 패턴으로, 전체 트리 구조에 대해 재귀적으로 메서드들을 실행하고 결과를 요약하는 기능을 제공
구조
- Component
트리의 단순 요소들과 복잡한 요소들 모두에 공통적인 작업을 설명하는 인터페이스
- Leaf
트리의 기본 요소이며 하위요소가 없음. 일반적으로 Leaf 컴포넌트들은 작업을 위임할 하위요소가 없어서 대부분의 실제 작업들을 수행
- Composite
컨테이너(일명 복합체)는 하위 요소들(Leaf 또는 기타 컨테이너)이 있는 요소로, 컨테이너는 자녀들의 구상 클래스들을 알지 못하며, 컴포넌트 인터페이스를 통해서만 모든 하위 요소들과 함께 작동함.
요청을 전달받으면 컨테이너는 작업을 하위 요소들에 위임하고 중간 결과들을 처리한 다음 최종 결과들을 클라이언트에 반환한다.
- Client
컴포넌트 인터페이스를 통해 모든 요소들과 작동한다. 그 결과 클라이언트는 트리의 단순 요소들 또는 복잡한 요소들 모두에 대해 같은 방식으로 작업할 수 있다.
예시
Component
public interface Graphic { void move(int x, int y); void draw(); }
Leaf
public class Dot implements Graphic { protected int x; protected int y; public Dot(int x, int y) { this.x = x; this.y = y; } @Override public void move(int x, int y) { this.x += x; this.y += y; } @Override public void draw() { System.out.println("x(" + this.x + ")와 y(" + this.y + ")에 점을 그린다."); } } public class Circle extends Dot { private int radius; public Circle(int x, int y, int radius) { super(x, y); this.radius = radius; } @Override public void draw() { System.out.println("x(" + this.x + ")와 y(" + this.y + ")에 반지름이 R(" + this.radius + ")인 원을 그린다."); } }
Composite
public class CompoundGraphic implements Graphic { private List<Graphic> children = new ArrayList<>(); public void add(Graphic child) { children.add(child); } public void remove(Graphic child) { children.remove(child); } @Override public void move(int x, int y) { for (Graphic child : children) { child.move(x, y); } } @Override public void draw() { for (Graphic child : children) { child.draw(); } } }
Client
public class Client { public static void main(String[] args) { CompoundGraphic smallGroup = new CompoundGraphic(); smallGroup.add(new Dot(1, 2)); smallGroup.add(new Circle(5, 3, 10)); CompoundGraphic allGroup = new CompoundGraphic(); allGroup.add(all); allGroup.add(new Dot(3, 4)); allGroup.draw(); allGroup.move(2, 4); allGroup.draw(); } } # 결과 x(1)와 y(2)에 점을 그린다. x(5)와 y(3)에 반지름이 R(10)인 원을 그린다. x(3)와 y(4)에 점을 그린다. x(3)와 y(6)에 점을 그린다. x(7)와 y(7)에 반지름이 R(10)인 원을 그린다. x(5)와 y(8)에 점을 그린다.
패턴 적용
- 계층적 트리 구조를 구현해야 할 때
- 클라이언트 코드가 단순 요소들과 복합 요소들을 모두 균일하게 처리하도록 할 때
장단점
장점
- 다형성과 재귀를 유리하게 사용해 복잡한 트리 구조들과 더 편리하게 작업할 수 있다.
- 개방/폐쇄 원칙 : 객체 트리와 작동하는 기존 코드를 훼손하지 않고 앱에 새로운 요소 유형들을 도입할 수 있다.
단점
- 기능이 너무 다른 클래스들에는 공통 인터페이스를 제공하지 어려울 수 있으며, 어떤 경우에는 컴포넌트 인터페이스를 과도하게 일반화해야하여 이해하기 어렵게 만들 수 있다.
'STUDY > 디자인패턴' 카테고리의 다른 글
Facade Pattern(퍼사드 패턴) (0) 2025.01.07 Decorator Pattern(데코레이터 패턴) (0) 2024.12.25 Bridge Pattern(브리지 패턴) (0) 2024.12.08 Adapter Pattern(어댑터 패턴) (0) 2024.12.08 Singleton Pattern(싱글턴 패턴) (0) 2024.11.26