Reactor 패턴- 어떠한 이벤트가 발생하면, 이곳으로 알려달라는 방식.- 윈도우 메시지 핸들러처럼, 특정 이벤트가 발생한다면 통지 받겠다는 방식. Proactor 패턴- 특정 작업을 시키고, 그 작업이 완료되면 알려달라는 방식.- IOCP에서 Completion Port가 이 방식을 취하고 있다. 얼추 비슷한데, 구현에서 차이점이 명확해진다. Proactor는 작업을 시키면서 콜백함수를 직접 넘김으로써 구현되고, Reactor는 디스패쳐를 구현하는 구조가 일반적. Reactor 패턴 사용시에는 디스패쳐를 통함으로써 스팟 포인트가 발생하게 되는 단점이 있다고 보면된다. 이에 비해 Proactor는 명령을 내린 작업에 대해서만 통지를 받게 된다. IOCP의 예를 들면, 내가 물려놓은 소켓에 Recv 이벤..
프로그램을 작성하다보면, 객체간에 동적으로 결합이 필요한 경우가 많습니다. 객체간에 동적으로 결합/해제를 통해서 기능을 추가/제거 하는 것을 데코레이터 패턴이라고 합니다. class LogDecorator { public: void Log(char *str, ...); }; class Game { LogDecorator *m_pLogDecorator; public: void Start() { if(m_pLogDecorator) m_pLogDecorator->Log("Game::Start() ..."); //게임시작처리 } void End() { if(m_pLogDecorator) m_pLogDecorator->Log("Game::End() ..."); //게임종료처리 } void SetLog(LogDec..
객체의 내부 동작 하나 하나보다, 어떤 동작을 한다는 것 자체가 중요할 때가 있습니다. 캐릭터에게 행동을 시킬 때, 어떤 행동을 하는지는 중요하지 않고, 행동을 한다는 그 자체만 중요할 때가 바로 그렇습니다. 이렇게 행동을 일반화하는 것을 커맨드 패턴이라고 부르고, 캡슐화의 구현이라고 보셔도 좋습니다. 다만 일반 캡슐화와는 조금 다른것이, 커맨드 패턴은 한 클래스당 한가지 일만 시키는 경우가 많다는 것입니다. 동작 하나를 하나의 클래스로 관리함으로써, 다양한 동작을 관리하기 쉽게 하겠다는 것이지요. class ICommand { public: virtual void Act() = 0; }; class CharacterParent : public ICommand { protected: virtual Cha..
동일한 종류의 객체 끼리는 중복된 정보를 가지게 될 가능성이 높습니다. 그래서 같은 종류의 객체끼리 중복되는 정보를 공유하는 것이 메모리 관리 측면이나, 중복을 제거하는 측면이나 이롭습니다. 중복되는 정보를 공유 하는 방법을 플라이 웨이트 패턴이라고 합니다. class ImageData { int m_nIdx; int m_nWidth, m_nHeight; char *m_pData; public: char *GetData(){return m_pData;} int GetWidth(){return m_nWidth;} int GetHeight(){return m_nHeight;} }; class ImagePool // ImageData의 객체 소유권은 ImagePool에 있다. { public: ImageDat..
어떤 객체가 수행하는 기능을 그대로 수행하면서, 부가적인 기능을 수행하거나 기존 역할을 대행하기 위해 새 클래스를 정의하고, 새로 정의된 클래스를 통해서 외부와 통신하는 것을 프록시 패턴이라고 합니다. class IObject { public: virtual void Use() = 0; }; class QuickSlot { IObject *m_piObejct; public: bool isExist() { return m_pObejct != NULL ? true : false; } void Use() { if(m_pObejct) m_pObejct->Use(); } }; class QuickSlotProxy { QuickSlot *m_pQuickSlot; public: QuickSlotProxy() : m_..
범용 적으로 사용 될 수 있는 알고리즘을 독립적인 클래스로 구성하고, 해당 클래스를 선택적으로 사용할 수 있게 하는 것을 스트래티지 패턴이라고 합니다. 스테이트 패턴과 비슷한 점이 많은 패턴이지만, 범용적으로 사용 될 수 있는 알고리즘을 독립시킨다는 점에서 차이가 있습니다. class Sort { public: virtual void Sort(int * pScore) = 0; }; class BubbleSort : public Sort { public: virtual void Sort(int *pScore) { //버블정렬 } }; class QuickSort : public Sort { public: virtual void Sort(int *pScore) { //퀵정렬 } }; class Score {..
내부적인 상태에 따라 다른 동작을 해야 될 경우, 각 동작의 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 ..
- Total
- Today
- Yesterday
- 게임개발포에버
- SQLite Spy
- 디자인 패턴
- MS-SQL
- TDD
- CppSQLite
- SDL
- 조엘 온 소프트웨어
- Ruby on Rails
- 엘키
- 멀티스레드
- NDC2013
- TraceRoute
- c언어
- 루비
- perfmon
- 임백준
- ruby
- 리버스 엔지니어링
- 좋은 프로그래머
- 게임데브포에버
- ftp
- EzShortcut
- 디버깅
- EasyExec
- Rails
- RoR
- 루비 온 레일즈
- svn
- 바로가기 프로그램
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |