// Composite Pattern - 객체의 포함 관계를 만드는 패턴

// Menu Item : 개별객체

// Popup Menu : 복합객체

// 복합객체 - 개별객체+복합객체 (동일부모 필요)

// command - 부모에 존재해야만 한다.

// 재귀적인 포함을 사용한 복합 객체의 구현을 하는 설계 방법


  1. abstract class BaseMenu {
  2.         private String title;
  3.  
  4.         public BaseMenu(String s) {
  5.                 title = s;
  6.         }
  7.  
  8.         public String getTitle() {
  9.                 return title;
  10.         }
  11.        
  12.         // 부모 입장에서는 구현해 줄 필요가 없고, 자식이 만들어야 한다면 추상메소드로 설계하자.
  13.         public abstract void command(); //하나라도 abstract가 있으면 abstract 클래스가 되어야한다.
  14. }
  15.  
  16. class PopupMenu extends BaseMenu {
  17.         List<BaseMenu> items = new ArrayList<>();
  18.         private Scanner scan;
  19.         public PopupMenu(String s) {
  20.                 super(s);
  21.                 scan = new Scanner(System.in);
  22.         }
  23.        
  24.         public void addMenu(BaseMenu menu) {
  25.                 items.add(menu);
  26.         }
  27.         @Override
  28.         public void command() {
  29.                 System.out.println();
  30.                 int sz = items.size();
  31.                 while(true) {
  32.                         System.out.println();
  33.                         for (int i = 0; i < sz; i++) {
  34.                                 System.out.println((+ 1) + ". " + items.get(i).getTitle());
  35.                         }
  36.                        
  37.                         System.out.println((sz +1) + ". 상위 메뉴로...");
  38.                         System.out.println("메뉴를 선택하세요 >> ");
  39.                        
  40.                         int cmd = scan.nextInt();
  41.                         if(cmd < 1 || cmd > sz + 1) {
  42.                                 continue;
  43.                         }
  44.                         if(cmd == sz +1) {
  45.                                 break;
  46.                         }
  47.                         items.get(cmd - 1).command();
  48.                 }
  49.         }
  50.        
  51. }
  52.  
  53. class MenuItem extends BaseMenu {
  54.  
  55.         public MenuItem(String s) {
  56.                 super(s);
  57.         }
  58.  
  59.         @Override
  60.         public void command() {
  61.                 System.out.println(getTitle() + "command execution!");
  62.                
  63.         }
  64.  
  65. }
  66.  
  67. public class Ex1 {
  68.  
  69.         public static void main(String[] args) {
  70.                 PopupMenu menubar = new PopupMenu("MenuBar");
  71.                 PopupMenu p1 = new PopupMenu("화면설정");
  72.                 PopupMenu p2 = new PopupMenu("소리설정");
  73.                
  74.                 menubar.addMenu(p1);
  75.                 menubar.addMenu(p2);
  76.                
  77.                 p1.addMenu(new MenuItem("해상도 변경"));
  78.                 p1.addMenu(new MenuItem("색상 변경"));
  79.                 p1.addMenu(new MenuItem("명암 변경"));
  80.                
  81.                 p2.addMenu(new MenuItem("볼륨 조절"));
  82.                 p2.addMenu(new MenuItem("음향 조절"));
  83.                
  84.                 menubar.command();
  85.         }
  86.  
  87. }


'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

+ Recent posts