컴포짓 패턴
composite : 복합의
그룹 전체와 개별 객체를 동일하게 처리할 수 있는 패턴
-> 클라이언트 입장에서는 '전체'나 '부분'이나 모두 동일한 컴포넌트로 인식할 수 있는 계층 구조를 만든다. (Part Whole Hierarchy)
클라이언트 입장에서는 전체인지, 그 하위인지, 제일 아래 하위 단인지 모르고 사용하게 된다.
이러한 특성으로 인해 트리구조가 있어야만 존재가능한 패턴이다.
코드로 살펴보기
클라이언트는 무기, 약과 같은 것들을 가방안에 담을 수 있다고 하자.
Weapon은 아래와 같다.
Medicine은 아래와 같다.
Medicine과 Weapon은 거의 똑같은 구조를 가지고 있다.
이제 이들을 Bag에 넣을 수 있다.
Bag
이제 이들을 사용하는 Client코드를 보자.
Client
그런데 위와 같이 한다면 가방 안의 item들의 가격을 알기 위해 Client가 너무 많은 것들을 알고 있어야 한다.
객체지향적으로 가방에 들어있는 모든 것들의 값을 Client가 알아야하는 것은 옳지 않다.
즉 Client가 너무 디테일한 것들을 알고 있다.
또한 갑옷이 추가되어 갑옷을 가방안에 넣으려한다면?
Amour
Bag과 Client의 코드도 모두 수정되어야 한다.
이와 같은 코드는 확장성이 매우 좋지 않고(Amour를 추가하였는데 기존의 Bag과 Client가 수정되어야한다.), Client가 너무 많은 것을 알고있다.
이제 컴포짓 패턴을 사용하여 이러한 문제를 해결해보자.
우리는 Component를 만드는데, Component에는 공통적인 operation이 들어가며 실제로 구체화할 수 없는 인터페이스 혹은 추상클래스로 정의한다.
ItemComponent
이제 Weapon, Medicine, Amour와 같은 Leaf들은 이를 implements한다.
위와 같은 ItemComponent들을 같는 Bag은 Composite이라 할 수 있다.
그런데 Client는 "전체"든 "개별"이든 동일하게 사용할 수 있어야 하므로, Composite도 Component이다.
Bag
위와 같이하면 이제 새로운 Item이 추가되어도 bag은 수정할 필요가 없다.
이제 클라이언트 코드를 보자.
Client는 Component를 사용하기 때문에, weapon, medicine, amour, bag이든 상관없이 getPrice를 사용하고 있다.
즉 전체인지 개별인지 구분없이 사용하고 있다.
장점과 단점
장점
1. 복잡한 트리 구조를 편리하게 사용할 수 있다.
2. 다형성과 재귀를 활용할 수 있다.
3. 클라이언트 코드를 변경하지 않고, 새로운 엘리먼트 타입을 추가할 수 있다. OCP. (코드로 알아보기에서 본 printPrice)
단점
트리를 만들어야 하기 때문에(공통된 인터페이스를 정의해야 하기 때문에)지나치게 일반화해야 하는 경우가 생길 수 있다.
실제로는 어디에 사용되나?
자바의 데스트탑 어플리케이션 api Swing을 보면 Composite패턴이 적용된 것을 볼 수 있다.
JFrame이 Composite으로 JTextField, JButton과 같은 Component들을 포함하고 있는 Component이다.
즉 JFrame, JTextField, JButton 모두 Component를 extends하고 있다.
그런데 Composite인 JFrame만이 Container를 extends하고 있는데, Container는 모든 Component들을 가질 수 있다.
출처: 인프런 백기선님 '코딩으로 학습하는 GoF 강의'
https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4
'Design Pattern' 카테고리의 다른 글
10. 퍼사드 패턴 (facade pattern) (0) | 2021.12.21 |
---|---|
9. 데코레이터 패턴(Decorator pattern) (0) | 2021.12.21 |
7. 브릿지 패턴 (Bridge pattern) (2) | 2021.12.18 |
6. 어댑터 패턴(Adapter pattern) (0) | 2021.12.17 |
5. 프로토타입 패턴(Prototype Pattern) (0) | 2021.12.16 |