와챠의 우당탕탕 코딩 일기장
[JAVA 디자인 패턴] - 7, Composite 패턴 본문
반응형
Composite Pattern
Composite 패턴은 디렉터리와 파일의 관계처럼 재귀적인 구조를 가진 패턴이다.
(Composite 패턴의 가장 기본적인 예는 파일과 디렉터리의 관계이다.)
재귀적인 구조란
디렉터리가 그릇 역할도 하고(디렉터리(그릇) 안에 파일(내용물)이 들어갈 수 있음),
내용물 역할도 할 수 있는 것을 말한다(디렉터리(그릇) 안에 디렉터리(내용물)를 넣을 수 있음).
하지만 저 예제는 흔하므로 나는 목표를 만드는 예제를 만들어 보았다.
목표에는 추상적인 목표, 구체적인 목표가 있고,
추상적인 목표는 추상적인 목표와 구체적인 목표를 포함할 수 있게 했다.
파일과 디렉터리로 설명하면 추상적인 목표는 디렉터리고, 구체적인 목표는 파일인 셈이다.
- DetailedGoal 클래스 = 구체적인 목표를 나타내는 클래스. (내용물)
- AbstractGoal 클래스 = 추상적인 목표를 나타내는 클래스. (그릇, 내용물)
- (또 다른 Entry를 포함(◇)하므로 재귀적인 구조를 갖게 한다.)
- v = 구체적인 목표들을 담는 벡터
- printList 메소드 = 추상적인 목표에 담긴 구체적인 목표들을 재귀적으로 출력하는 메소드
- Entry 클래스 = 구체적인 목표와 추상적인 목표를 내용물로 만들어주는 클래스(동일시해주는 클래스)
- DetailedGoal 클래스와 AbstractGoal 클래스가 이 클래스를 상속받으면서 내용물 역할을 하게 해 줌.
특징
- Composite 패턴은 그릇이 또 다른 그릇의 내용물이 될 수 있다는 특징을 가졌다.(그릇과 내용물이 동일시)
오류 처리 방법들
Entry의 add 메소드는 구체적인 목표(파일)에선 쓰이지 않고,
구체적인 목표(디렉터리)에만 쓰인다.
파일 안에 디렉터리를 추가할 수 없기 때문이다.
이 예제에서는 파일 안에 다른 파일을 추가할 수 없도록 하는 오류 처리를 Entry 클래스에서 구현하였다.
다른 오류 처리 방법들도 알아보자.
- Entry 클래스의 add 메소드에서 오류 처리하기(현재 예제)
- Entry 클래스의 add 메소드를 아무것도 실행되지 않게 구현하기
- Entry 클래스에서 추상 메소드로 선언만 하고 구현은 하지 않기
- DetailedGoal 클래스(디렉터리 클래스)에만 add 메소드 넣기
JAVA 언어로 배우는 디자인 패턴 입문(p 196~209) 참고
재귀적인 출력 구조 구현하는 거가 제일 어려웠다...
처음엔 '어떻게 아무렇게나 하다 보면 언젠가 하나 걸리겠지'란 맘으로 대충 했는데,
계속 안 되길래...ㅋ
지금 prefix는 뭔지 클래스 다이어그램을 보며 클래스 간의 관계를 이해하고,
Main에서부터의 printList 순서를 쭉 따라가 보니 해결할 수 있었다.
반응형
'코딩 일기장 > JAVA 디자인 패턴' 카테고리의 다른 글
[JAVA 디자인 패턴] - 6, Strategy 패턴 (0) | 2020.11.09 |
---|---|
[JAVA 디자인 패턴] - 5, Singleton 패턴 (0) | 2020.10.02 |
[JAVA 디자인 패턴] - 4, Factory Method 패턴 (0) | 2020.10.02 |
[JAVA 디자인 패턴] - 3, Template Method 패턴 (0) | 2020.09.22 |
[JAVA 디자인 패턴] - 2, Adapter 패턴 (0) | 2020.09.16 |
Comments