// Composite Pattern - 객체의 포함 관계를 만드는 패턴
// Menu Item : 개별객체
// Popup Menu : 복합객체
// 복합객체 - 개별객체+복합객체 (동일부모 필요)
// command - 부모에 존재해야만 한다.
// 재귀적인 포함을 사용한 복합 객체의 구현을 하는 설계 방법
- abstract class BaseMenu {
- private String title;
- public BaseMenu(String s) {
- title = s;
- }
- public String getTitle() {
- return title;
- }
- // 부모 입장에서는 구현해 줄 필요가 없고, 자식이 만들어야 한다면 추상메소드로 설계하자.
- public abstract void command(); //하나라도 abstract가 있으면 abstract 클래스가 되어야한다.
- }
- class PopupMenu extends BaseMenu {
- List<BaseMenu> items = new ArrayList<>();
- private Scanner scan;
- public PopupMenu(String s) {
- super(s);
- scan = new Scanner(System.in);
- }
- public void addMenu(BaseMenu menu) {
- items.add(menu);
- }
- @Override
- public void command() {
- System.out.println();
- int sz = items.size();
- while(true) {
- System.out.println();
- for (int i = 0; i < sz; i++) {
- System.out.println((i + 1) + ". " + items.get(i).getTitle());
- }
- System.out.println((sz +1) + ". 상위 메뉴로...");
- System.out.println("메뉴를 선택하세요 >> ");
- int cmd = scan.nextInt();
- if(cmd < 1 || cmd > sz + 1) {
- continue;
- }
- if(cmd == sz +1) {
- break;
- }
- items.get(cmd - 1).command();
- }
- }
- }
- class MenuItem extends BaseMenu {
- public MenuItem(String s) {
- super(s);
- }
- @Override
- public void command() {
- System.out.println(getTitle() + "command execution!");
- }
- }
- public class Ex1 {
- public static void main(String[] args) {
- PopupMenu menubar = new PopupMenu("MenuBar");
- PopupMenu p1 = new PopupMenu("화면설정");
- PopupMenu p2 = new PopupMenu("소리설정");
- menubar.addMenu(p1);
- menubar.addMenu(p2);
- p1.addMenu(new MenuItem("해상도 변경"));
- p1.addMenu(new MenuItem("색상 변경"));
- p1.addMenu(new MenuItem("명암 변경"));
- p2.addMenu(new MenuItem("볼륨 조절"));
- p2.addMenu(new MenuItem("음향 조절"));
- menubar.command();
- }
- }
'java > design_pattern' 카테고리의 다른 글
State Pattern (0) | 2014.06.27 |
---|---|
Decorator Pattern (0) | 2014.06.27 |
Strategy Pattern (0) | 2014.06.27 |
Template Method Pattern (0) | 2014.06.27 |
Adapter 패턴 (0) | 2014.06.27 |