[디자인 모드] 의 조합 모드 (Composite)

조합 모델 의 공식 정 의 는 대상 을 하나의 트 리 구조 로 조합 하여 국부 - 전체적인 구 조 를 나타 내 는 것 이다.조합 모드 는 클 라 이언 트 로 하여 금 단독 대상 과 대상 조합 을 통일 적 으로 처리 할 수 있 게 한다.
영문 정 의 는 다음 과 같다.
Compose objects into tree structures to representpart-whole hierarchies. Composite lets clients treat individual objects and compositions of objectsuniformly.
정의 에는 세 가지 중요 한 키워드 (빨간색 굵 은 부분) 가 있 습 니 다.
첫 번 째 는 tree structures 입 니 다. 조합 모델 이 저 에 게 준 느낌 은 바로 나무 입 니 다. 조합 모델 에 사용 할 수 있 는 문제 입 니 다. 그 데이터 구 조 는 모두 나무 로 추상 화 될 수 있 습 니 다. 만약 에 데이터 구조 에 대한 이해 가 비교적 좋다 면 본 장 은 비교적 간단 해 야 합 니 다.
두 번 째 는 part - whole 입 니 다. part - whole 을 보고 저 는 학부 에서 도형 학 을 공부 할 때 분 형 도형 학 의 지식 을 접 한 것 을 연 상 했 습 니 다. 그래서 이것 은 이해 하기 도 간단 합 니 다. 즉, 국부 적 인 유사 성 입 니 다.
세 번 째 는 유 니 버 설 리 입 니 다. 정식 적 으로 조합 모델 의 구 조 는 부분 적 인 글자 유사 성 을 가 진 수 형 구조 이기 때문에 하나의 대상 (나무 속 의 잎 노드 와 유사) 과 대상 조합 (나무 속 의 부모 노드 와 유사) 을 통일 적 으로 처리 할 수 있 습 니 다.
조합 모델 을 실현 하 는 관건 은 하나의 간단 한 노드 를 표시 할 수 있 고 노드 용기 의 기 류 를 표시 할 수 있다 는 것 이다.
The key to the composite pattern is an abstract class that represents both primitives and containers.
이러한 기본 클래스 는 반드시 불필요 한 조작 을 정의 하고 안전 하지 않 은 조작 의 부작용 을 가 져 올 수 있 기 때문에 OO 디자인 의 원칙 을 위반 했다. 하 나 는 하위 클래스 에 만 의미 있 는 조작 을 정의 할 수 있다.
A class should only define operations that are meaningful to its subclasses.
물론 OO 디자인 을 하 는 데 불가피 한 trade - of 입 니 다. 물고기 와 곰 발바닥 을 동시에 얻 을 수 없습니다. 관건 은 우리 가 무엇 을 더 필요 로 하 느 냐 에 달 려 있 습 니 다. 조합 모델 의 특징 중 하 나 는 유 니 버 설 리 이기 때문에 transparency 는 safety 보다 중요 합 니 다.
조합 모델 의 사용 범 위 는 매우 광범 위 하 다. 가장 간단 한 예 는 바로 MVC 모델 중의 View 로 조합 모델 을 사용 했다.
다음은 코드 를 예 로 들 어 조합 모델 의 실현 방법 을 설명 한다.
우선 조합 모드 에 사용 되 는 중요 한 기본 클래스 를 정의 합 니 다.
4. 567913. 여러 가지 방법 을 정 한 것 을 볼 수 있다. 방법의 실현 은 간단 한 이상 을 던 지 는 것 일 뿐 인터페이스 로 정의 되 지 않 았 기 때문에 이렇게 하 는 이 유 는 서브 클래스 가 자신 이 필요 로 하 는 방법 만 다시 쓰 면 된다 는 것 이다.
그리고 그것 의 첫 번 째 키 종 류 를 정의 하 는 것 은 잎 노드 이다.
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();
    }
}

부모 노드 클래스 를 조합 하고 잎 노드 를 포함 하 는 용 기 를 정의 합 니 다.
public class MenuItem extends MenuComponent {
    String name;
    String description;
    boolean vegetarian;
    double price;
    
    public MenuItem(String name,
                    String description,
                    boolean vegetarian,
                    double price) {
        this.name = name;
        this.description = description;
        this.vegetarian = vegetarian;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    public double getPrice() {
        return price;
    }

    public boolean isVegetarian() {
        return vegetarian;
    }

    public void print() {
        System.out.println(" " + getName());
        if (isVegetarian()) {
            System.out.print("(v)");
        }

        System.out.println(", " + getPrice());
        System.out.println("    -- " + getDescription());
    }
}

클 라 이언 트 코드 는 다음 과 같 습 니 다.
import java.util.ArrayList;
import java.util.Iterator;

public class Menu extends MenuComponent {
    ArrayList<MenuComponent> menuComponents = new ArrayList<MenuComponent>();
    String name;
    String description;

    public Menu(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public void add(MenuComponent menuComponent) {
        menuComponents.add(menuComponent);
    }

    public void remove(MenuComponent menuComponent) {
        menuComponents.remove(menuComponent);
    }

    public MenuComponent getChild(int i) {
        return (MenuComponent)menuComponents.get(i);
    }

    public String getName() {
        return name;
    }

    public String getDescription() {
        return description;
    }

    public void print() {
        System.out.println("
" + getName()); System.out.println(", " + getDescription()); System.out.println("---------------------"); Iterator iterator = menuComponents.iterator(); while (iterator.hasNext()) { MenuComponent menuComponent = (MenuComponent)iterator.next(); menuComponent.print(); } } }

마지막, 테스트 코드
public class Waitress {
    MenuComponent allMenus;

    public Waitress(MenuComponent allMenus) {
        this.allMenus = allMenus;
    }

    public void printMenu() {
        allMenus.print();
    }
}

이로써 조합 모드 의 사용 은 소개 됐다.
이 를 통 해 알 수 있 듯 이 조합 모델 은 데이터 추상 적 인 구조 로 이 모델 의 사용 은 비교적 간단 해 야 한다. 왜냐하면 나무 구조의 데 이 터 는 쉽게 볼 수 있 기 때문이다.

좋은 웹페이지 즐겨찾기