Overview

복잡한 개체를 트리 구조로 구성하고 개별 개체인 것처럼 조작할 수 있는 구조적 디자인 패턴입니다.

장점
복잡한 트리 구조가 사용하기 더 편리합니다.
다형성 재귀를 유리하게 사용하십시오.
개방/폐쇄 원칙.
기존 코드를 중단하지 않고 애플리케이션에 새로운 요소 유형을 도입할 수 있습니다.
기존 코드는 이제 개체 트리에서 작동할 수 있습니다.
불리

기능이 상당히 다른 클래스에 공통 인터페이스를 제공하는 것은 어려울 수 있습니다.
특정 시나리오에서는 구성 요소 인터페이스를 과도하게 일반화하여 이해하기 어렵게 만들어야 합니다.

 

Structure

https://ko.wikipedia.org/wiki/%EC%BB%B4%ED%8F%AC%EC%A7%80%ED%8A%B8_%ED%8C%A8%ED%84%B4

 

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

+ Recent posts