디자인 패턴 ~Composite~

1. 소개



GoF의 디자인 패턴에서 Composite 패턴을 정리합니다.

2. Composite 패턴이란?


  • Composite라는 영어 단어는 혼합물이나 복합물이라는 의미입니다.
  • Composite 패턴은 용기와 내용물을 동일화하고 재귀적인 구조를 만드는 방식입니다.
  • 디렉토리와 파일을 함께 디렉토리 항목으로 취급하기 위해 컨테이너와 내용물을 같은 종류의 것으로 취급하면 편리할 수 있습니다. 예를 들면, 용기 중에는 내용물을 넣어도 좋고, 한층 더 용기를 넣는 것도 좋습니다. 이런 식으로 재귀 구조를 만들 수 있습니다.
  • GoF 디자인 패턴은 구조와 관련된 디자인 패턴으로 분류됩니다.

  • 3. 샘플 클래스 다이어그램





    4. 샘플 프로그램



    디렉토리, 파일 목록을 표시하는 프로그램입니다.

    4-1. Entry 클래스



    File과 Directory의 기본이 되는 클래스입니다.

    Entry.java
    public abstract class Entry {
    
        public abstract String getName();
        protected abstract void printList(String prefix);
    
        public void printList() {
            printList("");
        }
    }
    

    4-2. File 클래스



    파일을 나타내는 클래스입니다.

    File.java
    public class File extends Entry {
    
        private String name;
    
        public File(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        protected void printList(String prefix) {
            System.out.println(prefix + "/" + name);
        }
    }
    

    4-3. Directory 클래스



    디렉토리를 나타내는 클래스입니다.

    Directory.java
    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class Directory extends Entry {
    
        private String name;
        private ArrayList<Entry> directory = new ArrayList<Entry>();
    
        public Directory(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public Entry add(Entry entry) {
            directory.add(entry);
            return this;
        }
    
        protected void printList(String prefix) {
            System.out.println(prefix + "/" + name);
            Iterator<Entry> it = directory.iterator();
            while (it.hasNext()) {
                Entry entry = (Entry) it.next();
                entry.printList(prefix + "/" + name);
            }
        }
    }
    

    4-4. Main 클래스



    메인 처리를 실시하는 클래스입니다.

    Main.java
    public class Main {
        public static void main(String[] args) {
    
            Directory workspaceDir = new Directory("workspace");
            Directory compositeDir = new Directory("composite");
            Directory testDir1 = new Directory("test1");
            Directory testDir2 = new Directory("test2");
            workspaceDir.add(compositeDir);
            workspaceDir.add(testDir1);
            workspaceDir.add(testDir2);
    
            File directory = new File("Directory.java");
            File entity = new File("Entity.java");
            File file = new File("file.java");
            File main = new File("main.java");
            compositeDir.add(directory);
            compositeDir.add(entity);
            compositeDir.add(file);
            compositeDir.add(main);
            workspaceDir.printList();
        }
    }
    

    4-5. 실행 결과


    /workspace
    /workspace/composite
    /workspace/composite/Directory.java
    /workspace/composite/Entity.java
    /workspace/composite/file.java
    /workspace/composite/main.java
    /workspace/test1
    /workspace/test2
    

    5. 장점



    모든 객체(File, Directory)는 공통의 추상 클래스를 가지고 있으므로, 클라이언트로부터 봐, 어느 것이 File인가 Directory인가, 내용을 의식할 필요가 없고, 균일하게 취급할 수 있습니다 .
    또한 새로운 클래스 (예 : SymbolicLink)를 추가해도 기본 클래스 (Entry)의 인터페이스가 변경되지 않으면 클라이언트의 처리에는 영향을 미치지 않습니다.

    6. GitHub


  • htps : // 기주 b. 코 m / 이타나카 730 /

  • 7. 디자인 패턴 목록


  • GoF 디자인 패턴 요약

  • 8. 참고



    이번 기사 및 샘플 프로그램은 이하의 서적을 바탕으로 작성하였습니다.
  • Java 언어로 배우는 디자인 패턴 입문

  • 매우 이해하기 쉽고 공부가되었습니다. 감사합니다.
    디자인 패턴이나 샘플 프로그램에 대한 설명이 상세하게 쓰여져 있으므로, 꼭 서적의 분도 봐 주세요.

    좋은 웹페이지 즐겨찾기