[디자인 모드] 의 조합 모드 (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();
}
}
이로써 조합 모드 의 사용 은 소개 됐다.
이 를 통 해 알 수 있 듯 이 조합 모델 은 데이터 추상 적 인 구조 로 이 모델 의 사용 은 비교적 간단 해 야 한다. 왜냐하면 나무 구조의 데 이 터 는 쉽게 볼 수 있 기 때문이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.