예제 – 커맨드 패턴을 이용한 StarCraft의 웨이포인트 기능 구현
// Command 클래스 - 각 요청들의 인터페이스인 Command 클래스 역할
class Command
{
public:
virtual void execute() = 0;
};
// Unit 클래스- 각 요청에 따라 처리하는 Reciever 클래스 역할
class Unit
{
string actor;
public:
Unit(string _actor){
actor = _actor;
}
void GoPatrol(){
cout << "[순찰] " << actor << " : 순찰중" << endl;
}
void GoAttack(){
cout << "[공격] " << actor << " : 공격중" << endl;
}
void GoMove(){
cout << "[이동] " << actor << " : 이동중" << endl;
}
};
// Patrol 클래스 - 순찰명령을 구현한 ConcreteCommand 역할
class Patrol : public Command
{
public:
Patrol(Unit* _actor){
actor = _actor;
}
void execute()
{
actor->GoPatrol();
}
private:
Unit* actor;
};
// Attack 클래스 - 공격명령을 구현한 ConcreteCommand 역할
class Attack : public Command
{
public:
Attack(Unit* _actor){
actor = _actor;
}
void execute()
{
actor->GoAttack();
}
private:
Unit* actor;
};
// Move 클래스 – 공격명령을 구현한 ConcreteCommand 역할
class Move : public Command
{
public:
Move(Unit* _actor){
actor = _actor;
}
void execute()
{
actor->GoMove();
}
private:
Unit* actor;
};
// Waypoint 클래스 – 명령 객체들의 저장 및 삭제와 웨이포인트 기능의
// 실행을 구현한 Invoker 역할
class Waypoint
{
private:
vector<Command*> commandlist;
public:
void AddCommand(Command* com){
commandlist.push_back(com);
}
void DelCommand()
{
if(commandlist.size() > 0){
commandlist.pop_back();
}
}
Void Activate()
{
for( vector<Command*>::size_type x=0; x <commandlist.size(); x++){
commandlist[x]->execute();
}
}
};
// Main 함수
void main()
{
Waypoint* list = new Waypoint();
Unit* Marine = new Unit("해병");
Patrol* patrol = new Patrol(Marine);
Attack* attack = new Attack(Marine);
Move* move = new Move(Marine);
const int max = 5;
for(int x=0; x < max; x++)
{
char com;
cout << "해병에게 내릴" << x+1 << "번 명령을 입력하시오." << endl;
cout << "웨이포인트에 저장가능한 명령은 최대 5개입니다." << endl;
cout << "[a]공격 [p]순찰 [m]이동 [b]직전명령취소 [s]강제실행 : " ;
cin >> com;
switch(com){
case 's': cout<<"강제 명령 실행"<< endl; break;
case 'b': list->DelCommand(); break;
case 'a': list->AddCommand(attack); break;
case 'p': list->AddCommand(patrol); break;
case 'm': list->AddCommand(move); break;
default: cout<<"해당명령 해석불가능"<< endl;break;
}
cout << endl;
if(com == 'b'){
x = x-2;
}
if(com == 's'){
break;
}
}
cout << "해병에게 명령전달 중입니다" << endl;
Sleep(3000);
list->Activate();
delete patrol;
delete attack;
delete move;
delete Marine;
delete list;
}