티스토리 뷰

내부적인 상태에 따라 다른 동작을 해야 될 경우, 각 동작의 enum형을 정의하고, 그에 따른 동작을 정의하면 다음과 같은 코드 구조가 될 것이다.

enum NPC_STATE { NPCSTATE_WANDERING = 0, //배회하기 NPCSTATE_DETECTING, //적탐지루틴검사 NPCSTATE_RUSH, //돌격모드. 타겟에게돌격하는상태 NPCSTATE_FIGHT, //전투모드타겟을적으로 }; class Npc { NPC_STATE m_NpcState; public: void SetNpcState(NPC_STATE NpcState){m_NpcState = NpcState;} void Wandering(); void Detecting(); void Rush(); void Fight(); void Act() { switch(m_NpcState) { case NPCSTATE_WANDERING: Wandering(); break; case NPCSTATE_DETECTING: Detecting(); break; case NPCSTATE_RUSH: Rush(); break; case NPCSTATE_FIGHT: Fight(); break; } } };

스테이트 패턴은 상태에 따라 다른 함수 호출을 하는 것이 아니라, 각 상태별 동작을 상태 객체로 정의 해두고 상태가 변했을 때 객체를 교체한다. 그리고 설정된 상태 객체의 함수를 호출 함으로써 분기문을 제거한다.

class NpcState { public: virtual void Act() = 0; }; class NpcStateWandering : public NpcState { public: virtual void Act() { //배회동작 } }; class NpcStateDetecting : public NpcState { public: virtual void Act() { //탐지동작 } }; class NpcStateRush : public NpcState { public: virtual void Act() { //러쉬동작 } }; class NpcStateFight : public NpcState { public: virtual void Act() { //전투동작 } }; class Npc { NpcState* m_pNpcState; public: void SetNpcState(NpcState *pNpcState){m_pNpcState = pNpcState;}

void Act() { if(m_pNpcState) { m_pNpcState->Act(); } } };


'Software Engineering > Design Pattern' 카테고리의 다른 글

프록시 패턴 (Proxy)  (0) 2008.02.09
스트래티지 패턴 (Strategy)  (2) 2008.02.05
컴포지트 패턴 (Composite)  (0) 2008.02.05
이터레이터 패턴 (Iterator)  (0) 2008.02.05
옵저버 패턴 (Observer)  (0) 2008.02.04
댓글