티스토리 뷰
스테이트 패턴은 상태에 따라 다른 함수 호출을 하는 것이 아니라, 각 상태별 동작을 상태 객체로 정의 해두고 상태가 변했을 때 객체를 교체한다. 그리고 설정된 상태 객체의 함수를 호출 함으로써 분기문을 제거한다.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 |
- Total
- Today
- Yesterday
- ftp
- Ruby on Rails
- TraceRoute
- NDC2013
- c언어
- SQLite Spy
- MS-SQL
- 바로가기 프로그램
- 디자인 패턴
- perfmon
- 리버스 엔지니어링
- 게임데브포에버
- 루비 온 레일즈
- TDD
- 게임개발포에버
- 임백준
- EasyExec
- Rails
- 멀티스레드
- 좋은 프로그래머
- 엘키
- 조엘 온 소프트웨어
- ruby
- 루비
- CppSQLite
- svn
- EzShortcut
- 디버깅
- RoR
- SDL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |