티스토리 뷰

이미 존재하는 코드와 내가 원하는 인터페이스가 서로 다를 때, 인터페이스들 간에 소통을 돕는 연결 클래스를 두는 것이 좋습니다.

그렇게 중재자 역할을 해주는 클래스를 쓰는 것을, 어댑터 패턴이라고 부릅니다.


패턴 적용 전

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(); } };


댓글