어댑터 패턴 (Adaptor)
이미 존재하는 코드와 내가 원하는 인터페이스가 서로 다를 때, 인터페이스들 간에 소통을 돕는 연결 클래스를 두는 것이 좋습니다.
그렇게 중재자 역할을 해주는 클래스를 쓰는 것을, 어댑터 패턴이라고 부릅니다.
패턴 적용 전
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(); } };