티스토리 뷰
이미 존재하는 코드와 내가 원하는 인터페이스가 서로 다를 때, 인터페이스들 간에 소통을 돕는 연결 클래스를 두는 것이 좋습니다.
그렇게 중재자 역할을 해주는 클래스를 쓰는 것을, 어댑터 패턴이라고 부릅니다.
패턴 적용 전
enum QUEST_TYPE { QUESTTYPE_NONE = -1, QUESTTYPE_ORDER, QUESTTYPE_INSTANCE, }; const int MAX_ORDER_QUEST_NO = 1000; class OrderQuest { int m_nLastOrderQuestNo; public: OrderQuest(int a_nLastOrderQuestNo) { m_nLastOrderQuestNo = a_nLastOrderQuestNo; } bool isQuestRecvState() //해당퀘스트를받을수있는상태인지 { if(m_nLastOrderQuestNo <= 1000) //1000개의순차퀘스트를모두수행했으므로새순차퀘스트수행불가. return false; return true; //퀘스트받을수있다. } void NewQuest() { //새퀘스트를만든다. //그리고, m_nLastOrderQuestNo를새로부여한퀘스트의번호에대입한다. } }; const int MAX_INSTANCE_QUEST = 10; class InstanceQuest { int m_nInstanceQuestCount; public: InstanceQuest() { m_nInstanceQuestCount = 0; } bool isQuestRecvState() //해당퀘스트를받을수있는상태인지 { if(MAX_INSTANCE_QUEST <= m_nInstanceQuestCount) //최대인스턴스퀘스트만큼수행했으면더이상수행불가 return false; return true; } void NewQuest() { m_nInstanceQuestCount++; //새퀘스트를만든다. } }; class Character { OrderQuest m_cOrderQuest; InstanceQuest m_cInstanceQuest; public: bool NewQuest(QUEST_TYPE a_eQuestType) { switch(a_eQuestType) { case QUESTTYPE_ORDER: if(!m_cOrderQuest.isQuestRecvState()) return false; m_cOrderQuest.NewQuest(); break; case QUESTTYPE_INSTANCE: if(!m_cInstanceQuest.isQuestRecvState()) return false; m_cInstanceQuest.NewQuest(); break; default: //잘못된퀘스트타입이다 return false; } return true; } };
패턴 적용 후
class IQuest { public: virtual bool isQuestRecvState() = 0; //해당퀘스트를받을수있는상태인지 virtual void NewQuest() = 0; //새퀘스트를만들어달라는요청함수 }; const int MAX_ORDER_QUEST_NO = 1000; class OrderQuest : public IQuest { int m_nLastOrderQuestNo; public: OrderQuest(int a_nLastOrderQuestNo) { m_nLastOrderQuestNo = a_nLastOrderQuestNo; } virtual bool isQuestRecvState() //해당퀘스트를받을수있는상태인지 { if(m_nLastOrderQuestNo <= 1000) //1000개의순차퀘스트를모두수행했으므로새순차퀘스트수행불가. return false; return true; //퀘스트받을수있다. } virtual void NewQuest() { //새퀘스트를만든다. //그리고, m_nLastOrderQuestNo를새로부여한퀘스트의번호에대입한다. } }; const int MAX_INSTANCE_QUEST = 10; class InstanceQuest : public IQuest { int m_nInstanceQuestCount; public: InstanceQuest() { m_nInstanceQuestCount = 0; } virtual bool isQuestRecvState() //해당퀘스트를받을수있는상태인지 { if(MAX_INSTANCE_QUEST <= m_nInstanceQuestCount) //최대인스턴스퀘스트만큼수행했으면더이상수행불가 return false; return true; } virtual void NewQuest() { m_nInstanceQuestCount++; //새퀘스트를만든다. } }; class Character { IQuest *m_pQuest; public: Character(IQuest *pQuest){ m_pQuest = pQuest; } bool NewQuest() { if(m_pQuest == NULL) return false; if(!m_pQuest->isQuestRecvState()) return false; m_pQuest->NewQuest(); } };
'Software Engineering > Design Pattern' 카테고리의 다른 글
이터레이터 패턴 (Iterator) (0) | 2008.02.05 |
---|---|
옵저버 패턴 (Observer) (0) | 2008.02.04 |
프로토타입 패턴 (Prototype) (0) | 2008.02.04 |
빌더 패턴 (Builder) (2) | 2008.02.03 |
템플릿 메소드 패턴 (Template method) (0) | 2008.02.03 |
- Total
- Today
- Yesterday
- svn
- 리버스 엔지니어링
- ruby
- 루비 온 레일즈
- MS-SQL
- SDL
- Rails
- 임백준
- 게임데브포에버
- 조엘 온 소프트웨어
- ftp
- 디버깅
- RoR
- 루비
- NDC2013
- 바로가기 프로그램
- 게임개발포에버
- EzShortcut
- 디자인 패턴
- c언어
- TraceRoute
- SQLite Spy
- 멀티스레드
- 엘키
- CppSQLite
- TDD
- EasyExec
- 좋은 프로그래머
- perfmon
- Ruby on Rails
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |