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;
}
'Developer > Design Patterns' 카테고리의 다른 글
함수포인터, 함수객체를 사용한 인라인 치환 (0) | 2014.05.18 |
---|---|
Factory Pattern을 이용한 도형 만들기 (0) | 2014.05.17 |
템플릿 상속을 이용한 싱글톤 패턴 (0) | 2014.05.17 |
싱글톤 패턴 & RAII (0) | 2014.05.17 |
Mutex를 이용한 싱글톤패턴 동기화 (0) | 2014.05.17 |