본문 바로가기

CS/DesignPattern

(DesignPattern) 컴포짓 패턴

컴포짓 패턴이란 무엇이고 언제 사용하는가?

컴포짓 패턴은 단일 객체와 두 개 이상의 객체들의 집합을 같은 방법으로 처리하기 위해서 만들어진 패턴이다.

  • 단일 객체와 객체들의 집합 간의 처리 방법의 차이가 없을 경우에 사용한다.
  • 트리구조를 구성할때 주로 사용된다.

실습

컴포짓 패턴의 UML

Component

모든 component 들을 위한 추상화된 개념으로써, "Leaf" 와 "Composite" 클래스의 인터페이스이다.

 

Leaf

"Component" 인터페이스를 구현하고, 구체 클래스를 나타낸다.

 

Composite

"Component"  인터페이스를 구현하고, 구현되는 자식(Leaf or Composite) 들을 가지고, 이러한 자식들을 관리하기 위한 메서드(addChild, removeChild...)를 구현한다.

또한, 일반적으로 인터페이스에 작성된 메소드는 자식에게 위임하는 처리를 한다. 

* Composite.operation() => Leaf.operation(), 자세한 이해 아래 예제를 통해 할 수 있다.


간단한 파일 시스템 구현

추상화를 담당하는 Component 를 생성하고 File, Folder 클래스가 이를 상속받아 구현한다.

이때 Folder는 Composite에 해당되고 File은 Leaf에 해당된다. 이때 Folder는 리스트의 타입으로 Component 타입을 가진다. 

따라서 Folder, File은 동일한 추상 클래스(인터페이스)를 구현하고 있으므로 계층형 구조를 만들 수 있다. 

  • Composite은 구현되는 자식들을 관리하는 역할을 갖는다.
List <Component> children = new ArrayList <>();

public boolean addComponent(Component component)

 

/**
 * Project : EffectiveStudy
 *
 * @author : jwdeveloper
 * @comment : Component
 * Time : 9:05 오후
 */
abstract public class Component {

    private String name;

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
/**
 * Project : EffectiveStudy
 *
 * @author : jwdeveloper
 * @comment : Leaf
 * Time : 9:06 오후
 */
public class File extends Component{

    public File(String name) {
        super(name);
    }

}
/**
 * Project : EffectiveStudy
 *
 * @author : jwdeveloper
 * @comment : Composite
 * Time : 9:07 오후
 */
public class Folder extends Component{

    List<Component> children = new ArrayList<>();



    public Folder(String name) {
        super(name);
    }

    public boolean addComponent(Component component) {
        return children.add(component);
    }

    public boolean removeComponent(Component component) {
        return children.remove(component);
    }

    public List<Component> getChildren() {
        return children;
    }
}
/**
 * Project : EffectiveStudy
 *
 * @author : jwdeveloper
 * @comment :
 * Time : 9:05 오후
 */
public class Main {
    public static void main(String[] args) {

        Folder root = new Folder("root");
        Folder home = new Folder("home");
        Folder junwoo = new Folder("junwoo");
        Folder music = new Folder("music");
        Folder picture = new Folder("picture");
        Folder doc = new Folder("doc");
        Folder usr = new Folder("usr");

        File track1 = new File("track1");
        File track2 = new File("track2");
        File pic1 = new File("pic1");
        File doc1 = new File("doc1");
        File java = new File("java");

        root.addComponent(home);
            home.addComponent(junwoo);
                junwoo.addComponent(music);
                    music.addComponent(track1);
                    music.addComponent(track2);
                junwoo.addComponent(picture);
                    picture.addComponent(pic1);
                junwoo.addComponent(doc);
                    doc.addComponent(doc1);

        root.addComponent(usr);
            usr.addComponent(java);


        show(root);
    }

    private static void show(Component component) {
        System.out.println(component.getClass().getName() + "|" +component.getName());

        if (component instanceof Folder) {
            for (Component c : ((Folder) component).getChildren()) {
                show(c);
            }
        }

    }
}

실행 결과


Code Link

https://github.com/mike6321/PURE_JAVA/tree/master/EffectiveStudy/src/main/java/me/designpattern/j_composit

 

mike6321/PURE_JAVA

Contribute to mike6321/PURE_JAVA development by creating an account on GitHub.

github.com

References

https://mygumi.tistory.com/343

 

컴포지트 패턴(Composite Pattern) :: 마이구미

이 글은 디자인 패턴 중 컴포지트 패턴(Composite Pattern) 을 다룬다. 위키피디아의 내용을 기반으로 정리할 예정이다. 위키 - https://en.wikipedia.org/wiki/Composite_pattern 글의 주제를 다루기에 앞서, 글..

mygumi.tistory.com

https://stackify.com/oop-concepts-composition/

 

OOP Concepts for Beginners: What is Composition?

Composition is one of the key concepts of object-oriented programming languages, like Java. You can use it to reuse existing code, design clean APIs, and change the implementation of a class used in a composition without adapting any external clients. Take

stackify.com