ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Design Pattern] 컴포지트(Composite) 패턴 - 디자인 패턴
    CSE/Design Pattern 2015. 6. 13. 10:34

    Pattern #8  컴포지트 패턴




     객체의 트리를 나타내는데 사용




     패턴 요약 
      - 기본 클래스와 이를 포함하는 컨테이너 클래스를 재귀적인(recursive) 형태로 표현
      - 객체들의 집합을 다룰 때 유용
      - e.g. 폴더 안의 파일


     
     동기
      

      회사에서 당신이 맡은 업무는 Drawing Tool 을 개발하는 것이다. 이 Drawing Tool은 직선, 사각형, 원 등의 그림을 그릴 수 있으며, 각

    개체를 이동 및 속성 수정이 가능하다. 또한 몇 개의 개체를 묶어 하나의 Group 개체로 만들 수도 있다. 이러한 요구사항을 만족하기 위해서 어떻게 그림 개체 클래스들을 설계해야 되는가?

       

















      


     의도 
      - Part-whole Hierarchy를 표현하기 위하여 객체들을 트리 구조로 구성
      - Client가 개개의 객체와 그룹 객체를 동일하게 취급할 수 있게 만든다.






     적용 범위 
      - 객체들을 part-whole Hierarchy 고조로 표현하고자 할 때
      - 개개의 객체와 그룹 객체를 동일하게 취급하고자 할 때
     
     결과 
      - Primitive 객체와 composite 객체로 구성된 클래스 hierarchy를 정의
      - Client code가 단순해진다.
      - 새로운 종류의 컴포넌트 객체를 추가하기 쉽다. => 기존의 코드를 수정하지 않아도 새 컴포넌트 추가 가능





    예제.



    Component.java

     

    1
    2
    3
    4
    5
    6
    package composite;
     
    public interface Component {
        public void show();
    }
     
    cs




    Composite.java

     

    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
     
    package composite;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class Composite implements Component {
     
        private List<Component> childComponents = new ArrayList<Component>();
     
        public void add(Component component) {
            childComponents.add(component);
        }
     
        public void remove(Component component) {
            childComponents.remove(component);
        }
     
        public void show() {
            for (Component component : childComponents) {
                component.show();
            }
        }
     
    }
     
    cs




    Leaf.java

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    package composite;
     
    public class Leaf implements Component {
     
        private String name;
     
        public Leaf(String name) {
            this.name = name;
        }
     
        public void show() {
            System.out.println(name);
        }
     
    }
     
    cs




    CompositeMain.java

     

    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
     
    package composite;
     
    public class CompositeMain {
     
        public static void main(String[] args) {
            Leaf leaf1 = new Leaf("1");
            Leaf leaf2 = new Leaf("2");
            Leaf leaf3 = new Leaf("3");
            Leaf leaf4 = new Leaf("4");
            Leaf leaf5 = new Leaf("5");
     
            Composite composite1 = new Composite();
            composite1.add(leaf1);
            composite1.add(leaf2);
     
            Composite composite2 = new Composite();
            composite2.add(leaf3);
            composite2.add(leaf4);
            composite2.add(leaf5);
     
            composite1.add(composite2);
            composite1.show();
     
        }
     
    }
     
    cs











     

    댓글

Designed by Tistory.