[ 목차 ]
안녕하세요. 이번에 알아볼 JAVA 디자인패턴은 컴포지트(Composite) 패턴입니다.
컴포지트(Composite) 패턴 이란?
컴포지트 패턴은 객체들의 조직을 트리 구조로 구성하여 전체-부분 계층을 표현하는 구조 디자인 패턴입니다. 이 패턴을 사용하면 개별 객체와 복합 객체를 동일한 방식으로 다룰 수 있으므로 클라이언트 코드가 복잡한 트리 구조와 상호작용할 수 있게 됩니다.
컴포지트(Composite) 패턴 구현 방법
컴포지트 패턴을 구현하기 위해 다음 요소들이 필요합니다.
- Component: 트리 구조의 노드(개별 객체 및 복합 객체)에 공통되는 인터페이스입니다.
- Leaf: Component를 구현한 개별 객체입니다.
- Composite: Component를 구현한 복합 객체로, 자식 노드를 포함할 수 있는 트리 구조의 노드입니다.
import java.util.ArrayList;
import java.util.List;
// Component 인터페이스
public interface Employee {
void showEmployeeDetails();
}
// Leaf 클래스
class Developer implements Employee {
private String name;
private String position;
public Developer(String name, String position) {
this.name = name;
this.position = position;
}
@Override
public void showEmployeeDetails() {
System.out.println(name + " - " + position);
}
}
// Composite 클래스
class Manager implements Employee {
private String name;
private String position;
private List<Employee> employees;
public Manager(String name, String position) {
this.name = name;
this.position = position;
employees = new ArrayList<>();
}
public void addEmployee(Employee employee) {
employees.add(employee);
}
public void removeEmployee(Employee employee) {
employees.remove(employee);
}
@Override
public void showEmployeeDetails() {
System.out.println(name + " - " + position);
for (Employee employee : employees) {
employee.showEmployeeDetails();
}
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
Developer d1 = new Developer("John Doe", "Senior Developer");
Developer d2 = new Developer("Jane Smith", "Junior Developer");
Manager m1 = new Manager("Tom Brown", "Software Manager");
m1.addEmployee(d1);
m1.addEmployee(d2);
Developer d3 = new Developer("Emily White", "Senior Developer");
Developer d4 = new Developer("Michael Green", "Junior Developer");
Manager m2 = new Manager("Emma Black", "Software Manager");
m2.addEmployee(d3);
m2.addEmployee(d4);
Manager ceo = new Manager("Robert Williams", "CEO");
ceo.addEmployee(m1);
ceo.addEmployee(m2);
ceo.showEmployeeDetails(); // 전체 직원 정보를 트리 구조로 출력합니다.
}
}
컴포지트(Composite) 패턴의 장단점
장점
개별 객체와 복합 객체를 동일한 방식으로 다룰 수 있습니다. 이로 인해 클라이언트 코드의 복잡성이 줄어듭니다.
새로운 요소를 추가하거나 제거하는 것이 쉽습니다. 트리 구조를 변경하기 위해 기존 코드를 수정할 필요가 없습니다.
확장성이 높습니다. 새로운 구성 요소를 추가하는 것이 간단하므로 시스템이 발전하거나 요구 사항이 변경되었을 때 유용합니다.
단점
구성 요소 간의 명확한 구분이 어려울 수 있습니다. 구성 요소(Leaf와 Composite) 사이의 경계가 불명확해질 수 있습니다.
대규모 시스템에서는 성능 저하가 발생할 수 있습니다. 트리 구조가 복잡하게 얽혀 있으면 순회하는 데 시간이 오래 걸릴 수 있습니다.
컴포지트(Composite) 패턴의 활용 예
컴포지트 패턴은 다음과 같은 상황에서 사용합니다: - 전체와 부분에 대한 계층 구조를 표현하려는 경우 - 개별 객체와 복합 객체가 동일한 인터페이스를 공유해야 하는 경우 - 구성의 변경을 쉽게 수용하고 확장할 수 있는 구조를 원하는 경우 예시로는 파일 시스템의 폴더와 파일 구조, 그래픽 에디터에서의 도형 구조, 조직 구조 등이 있습니다. 이러한 경우에서 컴포지트 패턴을 사용하면 개별 객체와 복합 객체를 동일한 방식으로 처리할 수 있는 트리 구조를 손쉽게 구축할 수 있습니다.
2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴
2023.07.12 - [JAVA] - 디자인패턴 - 팩토리(Factory) 패턴
2023.07.12 - [JAVA] - 디자인패턴 - 어댑터(Adapter) 패턴
2023.07.12 - [JAVA] - JAVA 디자인패턴 - 싱글톤(Singleton) 패턴
2023.07.13 - [JAVA] - JAVA 디자인패턴 - 옵저버(Observer) 패턴
2023.07.13 - [JAVA] - JAVA 디자인패턴 - 데코레이터(Decorator) 패턴
2023.07.14 - [JAVA] - JAVA 디자인패턴 - 프록시(Proxy) 패턴
2023.07.14 - [JAVA] - JAVA 디자인 패턴 - 커맨드(Command) 패턴
2023.07.15 - [JAVA] - JAVA 디자인패턴 - 스트래티지(Strategy) 패턴
2023.07.16 - [JAVA] - JAVA 디자인패턴 - 템플릿 메서드(Template Method) 패턴
'JAVA' 카테고리의 다른 글
JAVA 디자인패턴 -프로토타입(Prototype) 패턴의 정의, 장점, 구현 (0) | 2023.07.17 |
---|---|
JAVA 디자인패턴 - 상태(State) 패턴의 정의, 구성요소, 구현, 장단점 (0) | 2023.07.17 |
JAVA 디자인패턴 - 템플릿 메서드(Template Method) 패턴 (0) | 2023.07.16 |
JAVA 디자인패턴 - 스트래티지(Strategy) 패턴 (0) | 2023.07.15 |
JAVA 디자인 패턴 - 커맨드(Command) 패턴 (0) | 2023.07.14 |
댓글