Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-15.log failed

文書の過去の版を表示しています。


Writing /volume1/Web/Public/dokuwiki/data/log/deprecated/2024-11-15.log failed

the Definition of Composite Pattern

컴포지트 패턴의 정의는 다음과 같습니다.

컴포지트 패턴을 이용하면 객체들을 트리 구조로 구성하여
부분과 전체를 나타내는 계층구조로 만들 수 있습니다.
이 패턴을 이용하면 클라이언트에서 개별 객체와 다른 객체
들로 구성된 복합 객체(composite)를 똑같은 방법으로
다룰 수 있습니다.

가령 메뉴를 기준으로 생각해 봅시다. 이 패턴을 이용하면 중첩되어 있는 메뉴 그룹과 메뉴 항목을 똑같은 구조내에서 처리할 수 있습니다. 메뉴와 메뉴 항목을 같은 구조에 집어 넣어서 부분-전체 계층구조(part-whole hierachy)를 생성할 수 있습니다. 여기서 부분-전체 계층구조란, 부분(메뉴 및 메뉴 항목)들이 모여있지만, 모든 것을 하나로 묶어서 전체로 다룰 수 있는 구조를 뜻합니다.

일단 메뉴를 이런 방식으로 만들고 나면 컴포지트 패턴을 써서 객별 객체와 복합객체들을 똑같은 식으로 다룰 수 있습니다. 조금 어렵죠? 다시 설명해 보자면, 메뉴, 서브메뉴, 서브서브메뉴 등과 함께 메뉴 항목으로 구성된 트리 구조가 있다고 하면 각각이 모두 복합 객체가 될 수 있다는 것입니다. 각 메뉴 안에 다른 메뉴 및 메뉴 항목이 또 들어있을 수 있으니까요. 개별 개체도 결국 메뉴라고 할 수 있습니다. 다른 객체가 들어있지 않을 뿐 이죠. 앞으로 배우게 되겠지만, 컴포지트 패턴을 따르는 디자인을 사용하면 간단한 코드만 가지고도 (인쇄같은) 똑같은 작업을 전체 메뉴 구조에 대해서 반복해서 적용할 수 있습니다.

이제 컴포지트 패턴의 클래스 다이어그램을 살표볼 차례입니다.

Class Diagram

Composite Pattern

컴포지트 패턴을 메뉴에 어떻게 적용할 수 있을까요? 우선 구성요소 인터페이스를 만드는 것 부터 시작해야 됩니다. 이 인터페이스는 메뉴와 메뉴 항목 모두에 적용되는 공통 인터페이스 역할을 하며, 이 인터페이스가 있어야만 그 둘을 똑같은 방법으로 처리할 수 있습니다. 즉, 메뉴와 메뉴 항목에 대해서 같은 메소드를 호출 할 수 있게 되죠.

사실 메소드 중에는 메뉴 항목에 대해서 호출하는게 말이 안되는 것도 있을 것이고, 메뉴에 대해 호출하면 이상한 메소드도 있을 것입니다. 하지만 그런 문제를 해결하는 방법은 잠시 후에 알아보도록 하겠습니다. 일단 지금은 메뉴를 어떤 식으로 컴포지트 패턴에 끼워 맞출 수 있을지 생각해 봅시다. Menu Composite

이제 MenuComponent 추상 클래스부터 시작해 봅시다. 메뉴 구성요소는 잎 노드와 복합노드 모두에서 쓰이는 인터페이스 역할을 한다는 점을 꼭 기억해 둡시다. 어쩌면 “이 MenuComponent에서 두가지 역할을 맡고 있는 것이 아닌가?”라는 생각을 하실지 모르겠습니다. 물론 그렇게 생각할 수 있지만, 그 점에 대해서는 나중에 다시 생각해 보도록 하겠습니다. 일단 지금은 MenuItem(잎)이나 Menu(복합 객체)에서 각자 용도에 맞지 않아서 구현할 필요가 없는 메소드에 대해서는 그냥 기본 메소드를 그대로 쓸 수 있도록 기본 구현 을 만들어 보도록 하겠습니다.

public abstract class MenuComponent{
 
    public void add(MenuComponent menuComponent) {
         throw new UnsupportedOperationException();
    }
    public void remove(MenuComponent menuComponent) {
         throw new UnsupportedOperationException();
    }
    public MenuComponent getChild(int i) {
         throw new UnsupportedOperationException();
    }
 
    public String getName() {
         throw new UnsupportedOperationException();
    }
    public String getDescription() {
         throw new UnsupportedOperationException();
    }
    public double getPrice() {
         throw new UnsupportedOperationException();
    }
    public boolean isVegetarian(){
         throw new UnsupportedOperationException();
    }
 
    public void print() {
         throw new UnsupportedOperationException();
    }
}

QR Code
QR Code study:java:design_pattern:composite (generated for current page)