컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
처음 읽어보고 나의 반응...
아니 시방 이게 뭔소리여?
자 이제 이 컴포지트 패턴을 이해해보자
컴포지트 패턴과 가장 유사한 예시로는 윈도우 파일시스템을 떠올릴 수 있다. File 이라는게 있고 Directory라는게 있다.
여러분이 알다시피 디렉토리는 파일을 담는다.
그럼 아래와 같이 코드로 나타낼 수 있겠다
Class File{
public void operation(){}
}
class Directory{
public List<File> lists;
public void operation(){}
public void add(File f){
list.add(f);
}
public void remove(File f){
list.add(f);
}
public File getChild(int index){
return list.at(index);
}
}
자 여기서 정의를 다시보자
컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
여기서 단일객체는 File을 의미하고 복합객체는 Directory를 의미한다.
즉 복합개체란 단일객체를 여러개 들고다니는 객체이다.
파일 시스템에 비유하면 디렉토리는 여러개의 파일을 들고 다닌다.
여기서 하나 더 여러분이 아는 사실은 디렉토리는 다른 디렉토리를 담을 수 있다. 즉
디렉토리는 파일과 다른 디렉토리를 동일 취급한다 <---> 단익객체와 복합객체 모두 동일하게 다루도록 한다
라는 의미가 되시겠다.
그림을 다시보자
여기서 Leaf는 File을 의미하고 Composite는 Directory를 의미한다.
즉 Leaf와 Composite를 동일하게 취급하겠다는 뜻이다!!!
Leaf와 Composite를 동일하게 취급하려면 어떻게 해야될까?
바로 두 클래스를 모두 Component를 상속받게 만들면 된다!
interface Component{
}
Class File extends Component {
public void operation(){}
}
class Directory extends Component {
public List<Component> lists;
public void operation(){}
public void add(Component f){
list.add(f);
}
public void remove(Component f){
list.add(f);
}
public Component getChild(int index){
return list.at(index);
}
}
위에처럼 코드를 고치면 이제 Directory는 다른 Directory를 담을 수 있다!!!
자 그럼 마직으로 이 패턴을 사용하면 무슨 이점을 얻을 수 있을 까?
컴포지트 패턴(Composite pattern)이란 객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 한다.
저 노란줄이 무슨의미인지 잘 감이 안잡힌다.
하지만 여러분이 디렉토리와 파일의 구조를 떠올려보면 쉽게 이해할 수 있을것이다!
폴더와 파일의 관계는 위 그림처럼 트리구조로 나타낼 수 있다!
자 그럼 아래 말이 이제 감이 잡히는가?
객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴
위 그림과 설명이 이제 완벽하게 이해가 될 것이다.
Leaf와 Composite를 폴더와 파일의 트리구조 처럼 나타내고 싶을 때 컴포지트 패턴을 사용하는 것이다!!
'디자인패턴' 카테고리의 다른 글
[디자인패턴] 브릿지 패턴이란 (0) | 2022.07.04 |
---|
댓글