You will be fine

<디자인패턴입문> 8. Composite 패턴

by BFine
반응형

www.yes24.com/Product/Goods/2918928

 

Java 언어로 배우는 디자인 패턴 입문

이 책은 디자인 패턴의 입문서입니다. GoF가 정리한 23개의 디자인 패턴을 하나씩 다루면서 객체 지향을 잘 모르는 초보자도 이해하기 쉽도록 정리하고 있습니다. 단순한 이론이나 논리을 제시하

www.yes24.com

 

가. 무엇인가

 a. 하나의 집합체와 재귀적인 구조

  -  그릇과 내용물을 동일시 해서 재귀적인 구조를 만들기 위한 디자인 패턴

  -  예로 디렉터리는 내부에 파일 또는 하위디렉토리가 있을 수 있다.

       => 상자 안의 상자로 된 구조, 이런구조를 재귀적인 구조라 부른다.

  -  composite는 혼합물 복합물이란 의미를 지니고 있다. 

 

나. 예제

 

 a. Leaf(나뭇잎) 역할

  -  내용물을 의미하며 내부에 다른 것은 넣을 수 없다.

public class File implements Entry{
    private final EntryType type = EntryType.F;
    private final String name;

    public File(String name) {
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public String getType() {
        return type.name();
    }

    @Override
    public void print(String prefix) {
        System.out.println(prefix+"/"+getName()+"("+getType()+")");
    }
}

 

 b. Composite(복합체) 역할

  -  그릇을 의미하며 Leaf 역할이나 Composite 역할을 추가 할 수 있다.

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

public class Directory implements Entry {
   private final EntryType type = EntryType.D;

   private final String name;
   private final List<Entry> list = new ArrayList<>();

   public Directory(String name) {
      this.name = name;
   }

   public void add(Entry entry) {
      list.add(entry);
   }

   @Override
   public String getName() {
      return name;
   }

   @Override
   public String getType() {
      return type.name();
   }

   @Override
   public void print(String prefix) {
      System.out.println(prefix+"/"+getName()+"("+getType()+")");
      for (Entry entry : list){
          entry.print(prefix+"/"+getName());
      }
   }
}

 

 c. Component의 역할

  -  Leaf 역할과 Composite 역할을 동일시 하는 역할을 한다.

  -  Component는 Leaf와 Composite의 공통 상위 클래스로 실현

public interface Entry {
    String getName();
    String getType();
    void print(String prefix);
}

 

 d. Main (Client)

public class Main {

    public static void main(String[] args) {
        Directory root = new Directory("root");
        Directory etc = new Directory("etc");
        Directory var = new Directory("var");
        Directory app = new Directory("app");
        app.add(new File("web.jar"));
        var.add(new File("1.jpg"));
        var.add(new File("2.jpg"));
        var.add(new File("3.jpg"));
        var.add(app);

        root.add(etc);
        root.add(var);

        root.print("");
    }
}

// 실행
/*
/root(D)
/root/etc(D)
/root/var(D)
/root/var/1.jpg(F)
/root/var/2.jpg(F)
/root/var/3.jpg(F)
/root/var/app(D)
/root/var/app/web.jar(F)
*/

 

다. 정리

 a. 복수와 단수의 동일시

  -  여러개를 모아 마치 하나인것처럼 취급하는 것이다.

  -  일반적으로 트리 구조로 된 데이터 구조는 Composite 패턴에 해당

Composite 패턴은 상자와 내용물을 동일시하여 하나의 집합체로 보고 재귀적으로 탐색하는 패턴이다.
반응형

블로그의 정보

57개월 BackEnd

BFine

활동하기