일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 기술면접
- Controller
- 플로이드 와샬
- onclick
- Django
- spring boot
- 음수가 포함된 최단경로
- kmeans
- 최단경로
- 거쳐가는 정점
- 다익스트라
- union-find
- 우선순위큐
- 엔테크서비스
- Android Studio
- 직무면접
- 코딩테스트
- 벨만 포드 알고리즘
- Python
- 유니온 파인드
- disjoint set
- clean code
- compiler
- BufferedReader
- dto
- 동적계획법
- scikit-learn
- bottom-up
- Java
- top-down
Archives
- Today
- Total
춤추는 개발자
[Design Pattern] 컴포지트 패턴(Composite Pattern)이란 본문
728x90
반응형
✅ 컴포지트 패턴이란?
컴포지트 패턴이란, 클라이언트가 복합 객체나 단일 객체를 동일하게 취급하는 것을 목적으로 한다. 특히 컴포지트(Composite)의 의도는 트리 구조로 작성하며, 전체-부분 관계를 표현하는 것으로 전체와 부분은 동일한 인터페이스를 사용할 수 있다.
[ 해당 패턴을 사용하는 경우 ]
1. 복합 객체와 단일 객체의 처리 방법이 동일한 경우, 전체-부분 관계를 정의할 수 있다.
2. 객체들 간에 계급 및 계층 구조가 있고 이를 표현해야 할 경우,
3. 대표적으로 Directory-File 관계가 존재한다.
[ 구조 ]
- Component
- Leaf와 Composite가 구현해야하는 Interface로, Leaf와 Composite는 모두 Component라는 같은 타입으로 다뤄 진다.
- Leaf
- 단일 객체로 Composite의 부분(자식) 객체로 들어간다.
- 이때, Component 형태로 다뤄진다.
- Composite
- 집합 객체로 Leaf 객체나 Composite를 부분(자식)으로 둔다.
- 이때, Component 형태로 다뤄진다.
- 클라이언트는 이 Composite를 통해 부분 객체들(Leaf나 Composite)을 다룰 수 있다.
[ 예제 코드 ]
import java.util.List;
interface Node {
public String getName();
}
class File implements Node {
private String name;
@Override
public String getName() { return name; }
}
class Directory implements Node {
private String name;
private List<Node> children;
@Override
public String getName() { return name; }
public void addChildren(Node node) {
children.add(node);
}
}
public class CompositePattern {
public static void main(String[] args) {
Directory dir1 = new Directory();
dir1.addChildren(new File());
dir1.addChildren(new Directory());
Directory dir2 = new Directory();
dir2.addChildren(dir1);
}
}
위 코드는 대표적인 전체-부분 관계를 갖는 Directory-File 구조를 나타낸 것이며 컴포지트 패턴의 각 역할들을 담당하는 클래스는 아래와 같다.
- Component - Node Interface
- Leaf - File Class
- Composite - Directory Class
이러한 구조를 기반으로 객체 dir1에 2개의 Node가 추가, dir2에 dir1을 추가하면서 트리 구조가 완성되었다.
만약 해당 코드에 수정, 삭제 기능 등이 추가되거나, 동일한 처리 방식을 가진 다른 단일 객체가 존재할 수 있다. 이런 경우, 컴포지트 패턴의 장점을 살려 확장성이 높고, OCP를 만족하는 코드를 만들 수 있게 될 것이다.
728x90
반응형
'Developer's_til > 그외 개발 공부' 카테고리의 다른 글
[Java] Json을 활용하는 구글의 오픈소스 Gson (0) | 2022.01.05 |
---|---|
[Java] Optional이란? 개념과 사용법 - 1 (0) | 2022.01.03 |
[Design Pattern] 템플릿 메서드 패턴(Template Method Pattern)이란 (0) | 2021.12.31 |
[Java] 제네릭(generic)이란? (0) | 2021.12.29 |
[Java] Lambda Expression(람다 표현식) (0) | 2021.12.27 |