728x90
Overview
복잡한 개체를 트리 구조로 구성하고 개별 개체인 것처럼 조작할 수 있는 구조적 디자인 패턴입니다.
장점
복잡한 트리 구조가 사용하기 더 편리합니다.
다형성 재귀를 유리하게 사용하십시오.
개방/폐쇄 원칙.
기존 코드를 중단하지 않고 애플리케이션에 새로운 요소 유형을 도입할 수 있습니다.
기존 코드는 이제 개체 트리에서 작동할 수 있습니다.
불리
기능이 상당히 다른 클래스에 공통 인터페이스를 제공하는 것은 어려울 수 있습니다.
특정 시나리오에서는 구성 요소 인터페이스를 과도하게 일반화하여 이해하기 어렵게 만들어야 합니다.
Structure
Code Example
package com.example.design.pattern.core;
import java.util.ArrayList;
import java.util.Iterator;
abstract class MenuComponent {
public void add(MenuComponent menuComponent) {
throw new UnsupportedOperationException();
}
public void remove(MenuComponent menuComponent) {
throw new UnsupportedOperationException();
}
public MenuComponent getChild(int index) {
throw new UnsupportedOperationException();
}
public String getName() {
throw new UnsupportedOperationException();
}
public String getDescription() {
throw new UnsupportedOperationException();
}
public String show() {
throw new UnsupportedOperationException();
}
}
class MenuItem extends MenuComponent {
private final String name;
private final String description;
public MenuItem(String name, String description) {
this.name = name;
this.description = description;
}
@Override
public String getName() {
return name;
}
@Override
public String getDescription() {
return description;
}
@Override
public String show() {
return getName() + "," + getDescription();
}
}
class Menu extends MenuComponent {
private final ArrayList<MenuComponent> menuComponents = new ArrayList<MenuComponent>();
private final String name;
private final String description;
public Menu(String name, String description) {
this.name = name;
this.description = description;
}
@Override
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponent);
}
@Override
public void remove(MenuComponent menuComponent) {
menuComponents.remove(menuComponent);
}
@Override
public MenuComponent getChild(int index) {
return (MenuComponent) menuComponents.get(index);
}
@Override
public String getName() {
return name;
}
@Override
public String getDescription() {
return description;
}
@Override
public String show() {
String menuDisplay = getMenuComponentInfo();
Iterator iterator = menuComponents.iterator();
while (iterator.hasNext()) {
MenuComponent menuComponent = (MenuComponent) iterator.next();
menuDisplay += "\n" + menuComponent.show();
}
return menuDisplay;
}
private String getMenuComponentInfo() {
return getName() + " ~ " + getDescription();
}
}
class Waitress {
private final MenuComponent allMenus;
public Waitress(MenuComponent allMenus) {
this.allMenus = allMenus;
}
public String printMenu() {
return allMenus.show();
}
}
public class MyComposite {
public static void main(String[] args) {
MenuComponent pancakeHouseMenu = new Menu("PancakeHouseMenu", "description");
MenuComponent dinnerMenu = new Menu("Diner Menu", "description");
MenuComponent cafeMenu = new Menu("Cafe Menu", "description");
MenuComponent allMenus = new Menu("All MENUS", "description");
allMenus.add(pancakeHouseMenu);
allMenus.add(dinnerMenu);
allMenus.add(cafeMenu);
MenuComponent dessertMenu = new Menu("Dessert Menu", "description");
dinnerMenu.add(dessertMenu);
pancakeHouseMenu.add(new MenuItem("K&B", "description"));
pancakeHouseMenu.add(new MenuItem("Y&Z", "description"));
Waitress waitress = new Waitress(allMenus);
System.out.println(waitress.printMenu());
}
}
Console Result
All MENUS ~ description
PancakeHouseMenu ~ description
K&B,description
Y&Z,description
Diner Menu ~ description
Dessert Menu ~ description
Cafe Menu ~ description
Conclusion
N/A
728x90
'Java Design Pattern' 카테고리의 다른 글
[ENG][디자인패턴]Proxy 패턴 이론과 설명 (0) | 2022.06.21 |
---|---|
[ENG][디자인패턴]Facade 패턴 이론과 설명 (0) | 2022.06.20 |
[ENG][디자인패턴]Command 패턴 이론과 설명 (0) | 2022.06.18 |
[ENG][디자인패턴]Abstract Factory 패턴 이론과 설명 (0) | 2022.06.17 |
[ENG][디자인패턴]Adapter 패턴 이론과 설명 (0) | 2022.06.06 |
[ENG][디자인패턴]Template Method 패턴 이론과 설명 (0) | 2022.06.04 |
[ENG][디자인패턴]Strategy 패턴 이론과 설명 (0) | 2022.06.03 |
[ENG][디자인패턴]State 패턴 이론과 설명 (0) | 2022.06.02 |