ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 구조(Structural) 패턴 - 복합체(Composite) 패턴
    Java/디자인패턴 2024. 11. 26. 13:15
    반응형

    복합체(Composite) 패턴구조(Structural) 패턴에 속합니다. 이 패턴은 객체를 트리 구조로 구성하여 부분-전체 계층 구조를 표현하는 데 사용됩니다. 클라이언트가 개별 객체와 복합 객체(즉, 객체의 그룹)를 동일하게 취급할 수 있도록 설계됩니다.


    복합체 패턴의 특징

    1. 트리 구조 관리:
      • 객체를 트리 형태로 구성하여 개별 객체와 복합 객체를 동일하게 처리합니다.
    2. 재귀적 구성:
      • 객체가 자신과 동일한 타입의 객체를 포함할 수 있습니다.
    3. 클라이언트의 단순화:
      • 클라이언트는 개별 객체와 복합 객체를 구분하지 않고 동일한 방식으로 처리할 수 있습니다.

    복합체 패턴의 구성요소

    1. Component (구성 요소):
      • 개별 객체와 복합 객체를 동일하게 취급하기 위한 인터페이스를 정의합니다.
    2. Leaf (잎):
      • 구성 요소의 기본 단위로, 실제 작업을 수행하는 개별 객체입니다.
    3. Composite (복합 객체):
      • 다른 Component 객체를 포함하며, 이를 통해 트리 구조를 형성합니다.
      • 자신의 구성 요소들에게 작업을 위임하거나 추가/삭제 작업을 수행할 수 있습니다.
    4. Client (클라이언트):
      • Component를 통해 개별 객체와 복합 객체를 동일하게 처리합니다.

    JAVA 예제

    1. Component 인터페이스

    // Component: 공통 인터페이스
    interface Component {
        void showDetails();
    }

     

     

    2. Leaf 클래스

    // Leaf: 트리의 말단 요소
    class File implements Component {
        private String name;
    
        public File(String name) {
            this.name = name;
        }
    
        @Override
        public void showDetails() {
            System.out.println("File: " + name);
        }
    }

     

     

    3. Composite 클래스

    import java.util.ArrayList;
    import java.util.List;
    
    // Composite: 다른 Component를 포함하는 클래스
    class Folder implements Component {
        private String name;
        private List<Component> components = new ArrayList<>();
    
        public Folder(String name) {
            this.name = name;
        }
    
        public void addComponent(Component component) {
            components.add(component);
        }
    
        public void removeComponent(Component component) {
            components.remove(component);
        }
    
        @Override
        public void showDetails() {
            System.out.println("Folder: " + name);
            for (Component component : components) {
                component.showDetails();
            }
        }
    }

     

     

    4. 사용 예시

    public class CompositePatternExample {
        public static void main(String[] args) {
            // Leaf 객체 생성
            Component file1 = new File("File1.txt");
            Component file2 = new File("File2.txt");
            Component file3 = new File("File3.txt");
    
            // Composite 객체 생성
            Folder folder1 = new Folder("Folder1");
            Folder folder2 = new Folder("Folder2");
    
            // 트리 구조 형성
            folder1.addComponent(file1);
            folder1.addComponent(file2);
    
            folder2.addComponent(file3);
            folder2.addComponent(folder1);
    
            // 클라이언트가 동일한 방식으로 처리
            System.out.println("Displaying Folder2:");
            folder2.showDetails();
        }
    }

     

     

    실행 결과

    Displaying Folder2:
    Folder: Folder2
    File: File3.txt
    Folder: Folder1
    File: File1.txt
    File: File2.txt

    복합체 패턴의 활용 사례

    1. 파일 시스템:
      • 폴더와 파일 간 계층 구조를 표현.
    2. GUI 구성 요소:
      • 버튼, 텍스트 필드, 패널 등과 같은 위젯의 계층 구조 관리.
    3. 조직 구조:
      • 회사의 부서와 직원 간 계층 구조를 표현.
    4. 게임 엔진:
      • 게임의 객체(캐릭터, 아이템 등)를 트리 형태로 관리.

    장점

    1. 부분-전체 일관성:
      • 개별 객체와 복합 객체를 동일하게 취급할 수 있습니다.
    2. 확장성:
      • 새로운 Leaf 또는 Composite를 쉽게 추가할 수 있습니다.
    3. 클라이언트 코드 단순화:
      • 복합 객체와 단일 객체를 구분하지 않고 처리할 수 있습니다.
    4. 재귀적 구조 표현:
      • 트리 구조를 자연스럽게 표현할 수 있습니다.

    단점

    1. 복잡성 증가:
      • 트리 구조의 깊이가 깊어질수록 구조가 복잡해질 수 있습니다.
    2. 클래스 설계의 유연성 제한:
      • 모든 구성 요소가 동일한 인터페이스를 구현해야 하므로 제한이 있을 수 있습니다.
    3. 불필요한 기능 노출:
      • Leaf 객체에서 사용되지 않는 Composite 관련 메서드가 노출될 수 있습니다.
    반응형

    댓글

Designed by Tistory.