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


// Composite Pattern

// 복합 객체와 단일 객체의 처리

#include <iostream>

#include <string>

#include <vector>

#include <conio.h>

 

using namespace std;

 

class BaseMenu {

private:

        string title;

 

public:

        BaseMenu(string t) : title(t) {}

        virtual void command()=0;

        string getTitle() { return title; }

};

 

 

class MenuItem : public BaseMenu {

public:

        MenuItem(string t) : BaseMenu(t) {}

 

        // 메뉴 아이템 자기 자신이 선택되었을 때의 이벤트 처리

        void command() {

               cout << getTitle() << " 메뉴가 선택됨" << endl;

               getch();

        }

};

 

//메뉴 아이템을 저장할 팝업메뉴 클래스

class PopupMenu : public BaseMenu {

private:      

        vector<BaseMenu*> item;

 

public:

        PopupMenu(string t) : BaseMenu(t) {}

        void addMenu(BaseMenu* p) { item.push_back(p); }

 

        // 팝업 메뉴는 자신이 클릭될 경우, 자신이 가지고 있는 메뉴 아이템을 출력해야 한다.

        // 이벤트 처리를 위한 핸들러

        void command() {

               while(1) {

                       system("cls");

                       int size=item.size();

                      

                       for(int i=0; i<size; i++)

                              cout << i+1 << ". " << item[i]->getTitle() << endl;

                       cout << size + 1 << ". 상위 메뉴로" << endl;

 

                       int cmd;

                       cout << "# 메뉴를 선택하세요 >> ";

                       cin >> cmd;

 

                       if(cmd==size+1) break;

                       if(cmd < 1 || cmd > size+1) continue;

 

                       item[cmd-1]->command();

               }

        }

};

 

int main(void) {

 

        PopupMenu* menubar=new PopupMenu("메뉴바");

 

        PopupMenu* file=new PopupMenu("파일");

        file->addMenu(new MenuItem("열기"));

        file->addMenu(new MenuItem("저장"));

        file->addMenu(new MenuItem("인쇄"));

        menubar->addMenu(file);

 

        PopupMenu* edit=new PopupMenu("편집");

        edit->addMenu(new MenuItem("복사하기"));

        edit->addMenu(new MenuItem("잘라내기"));

        edit->addMenu(new MenuItem("붙여넣기"));

        menubar->addMenu(edit);

 

 

        menubar->command();

        return 0;

}

Posted by No names
,