SlideShare ist ein Scribd-Unternehmen logo
1 von 48
디자인 패턴 박광호(hopkh12@gmail.com) http://hopkh.nayana.kr/tc/
참고자료 GoF디자인패턴! 이렇게 활용한다 http://code1009.tistory.com/category/셈말짓기/GoF http://www.mcdonaldland.info/files/designpatterns/designpatternscard.pdf http://www.dofactory.com/Patterns/Patterns.aspx http://elky.tistory.com/category/소프트웨어%20개발
Abstract Factory(제품(Product)별 객체 생성) 구체적 클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기위한 인터페이스를 제공한다.
Abstract Factory(제품(Product)별 객체 생성) class Device{}; class DeviceGraphics : Device {  Grahpics* CreateWindows();  Grahpics* CreateLinux(); } class DeviceSound : Device { … } class Engine{  Grahpics* CreateGraphics();  Sound* CreateSound(); } class EngineWindows : Engine{  Graphics* CreateGraphics(){   return DeviceGraphics->CreateWindow();   }  Sound* CreateSound(){ … } };
Builder(부분 부분 생성을 통한 전체 객체 생성) 복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여 서로 다른 표현이라도 이를 생성할 수 있는 동일한 구축 공정을 제공할 수 있도록 한다.
Builder(부분 부분 생성을 통한 전체 객체 생성) class NPC{  void SetHP( … ){ … };  void SetSP( … ){ … }; }; void NPCBuilder{  virtual void SetHP() { … }  virtual void SetSP() { … };  NPC* m_pNPC; } class NPCBuilder1 : NPCBuilder{  virtual void SetHP() {    m_pNPC->SetHP( 100 );   }  virtual void SetSP() {   m_pNPC->SetSP( 100 );  }; } class NPCBuilder2 : NPCBuilder{ … } void Stage{  void Create( NPCBuilder* pNPCBuilder ){   pNPCBuilder->SetHP();   pNPCBuilder->SetSP();  } };
Factory Method(대행 함수를 통한 객체 생성) 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한결정은 서브클래스에서 이루어지도록 Factory Method 패턴은 서브클래스에게 인스턴스 생성의 책임을 미룬다.
Factory Method(대행 함수를 통한 객체 생성) class App {  virtual View* CreateView() = 0; }; class View { }; class MyApp : public App{  View* CreateView(){   return new MyView;  } }; class MyView : public View{ };
Prototype(복제를 통한 객체 생성) 견본적(prototypical) 인스턴스를 사용하여 생성할 객체의 종류를 명시하고 이렇게 만들어진견본을 복사해서 새로운 객체를 생성한다.
Prototype(복제를 통한 객체 생성) class NPC{  virtual NPC* Clone() = 0;  NPC( const NPC& npc ){ … } }; class NPC_1{  virtual NPC* Clone(){   return new NPC_1( *this );  } }; NPC* p1 = new NPC_1; NPC* p2 = p1->Clone();
Singleton(최대 N개까지로 객체생성을 제한) 클래스에서 만들 수 있는 인스턴스가 오직 하나일 경우에 이에 대한 접근은 어디에서든지 하나로만 통일하여 제공한다.
Singleton(최대 N개까지로 객체생성을 제한) //개수제한 class NPC{  static ints_iTotalCount = 20;  static NPC* CreateNPC(){ … }  static void DeleteNPC(){ … } protected:  NPC(){}  NPC( const NPC& npc ){ ... } }; //단일객체 class NPCMng {  static NPCMngGetInstance(){   return s_Instance;  }; protected:  static NPCMngs_Istance; NPCMng(){} NPCMng(const NPCMng &p )(){} };
Adapter(기존 모듈 재사용을 위한 인터페이스 변경) 클래스의 인터페이스를 클라이언트가 기대하는 형태의 인터페이스로 변환한다.어댑터 패턴은 서로 일치하지 않는 인터페이스를 갖는 클래스들을 함께 작동 시킨다.
Adapter(기존 모듈 재사용을 위한 인터페이스 변경) //현재버전 class Font {  virtual SIZE GetSize(){  …  } }; //새버전 class Font {  virtual FontSizeGetSize(){  …  } }; //개선 class GFont{  void SIZE GetSize(){ FontSize Size=m_Font.GetSize();  return SIZE( Size.x, Size.y );  } protected:  Font m_Font; };
Bridge(인터페이스와 구현의 명확한 분리) 구현과 추상화 개념을 분리하려는 것이다. 이로써 구현 자체도 하나의 추상화 개념으로 다양한 변형이 가능해지고, 구현과 독립적으로 인터페이스도 다양함을 가질 수 있게 된다.
Bridge(인터페이스와 구현의 명확한 분리) class Graphics{  virtual void DrawShape() = 0; }; class GraphicsDX9 : Graphics{  virtual void DrawPrimitive(){ … }; } class GraphicsDX10 : Graphics{  virtual void DrawPrimitive(){ … }; } class Engine{  void DrawShape(){   m_pGraphics->DrawShape();  } };
Composite(객체간의 부분-전체 관계 형성 및 관리) 부분-전체 계층을 나타내기 위한 복합 객체를 트리 구조로 만든다.Composite 패턴은 클라이언트가 개별적 객체와 복합 객체 모두를 동일하게 다루도록 한다.
Composite(객체간의 부분-전체 관계 형성 및 관리) class Base{ }; class Entity : Base{ }; class Node : Base{  std::list< Base* > m_BaseList; };
Decorator(객체의 기능을 동적으로 추가,삭제) 객체에 동적으로 새로운 서비스를 추가할 수 있게 한다. Decorator패턴은 기능의 추가를 위해서 서브클래스를 생성하는 것보다 융통성 있는 방법을 제공한다.
Decorator(객체의 기능을 동적으로 추가,삭제) class UI{}; class Window : UI{}; class CheckBox : Window{}; class Button : CheckBox{}; class RadioButton : Window{ CheckBox* m_pCheckBox; }
Facade(서브시스템의 명확한 구분 정의) 서브시스템을 합성하는 다수의 객체들의 인터페이스 집합에 대해 일관된 하나의 인터페이스를 제공할 수 있게 한다. Facade는 서브시스템을 사용하기 쉽게 하기 위한 포괄적 개념의 인터페이스를 정의 한다.
Facade(서브시스템의 명확한 구분 정의) class Graphics{}; … class Sound{}; … class Input{}; //현재 Graphics* pG = new Graphics; … Sound* pS = new Sound; … Input* pI = new Input //개선 class Engine {  void Create(){   m_pG = new Graphics;   m_pS = new Sound;   m_pI = new Input;c  } Protected:  Graphics* m_pG;  Sound* m_pS;  Input* m_pI; };
Flyweight(작은객체들의 공유) 대규모의 미세한 객체들을 효과적으로 사용하기 위해서는 공유 개념을 도입
Flyweight(작은객체들의 공유) class Mesh{  void CreateTexture( … ){  Texture* pRt = NULL;  if( IsLoadTexture ( … ) ){ pRt = new Texture( … ); pRt.push_back( … );  }  else{ pRt = m_TextureList.Find( … );  } m_pTexture = pRt; } protected:  Texture* m_pTexture;  std::list< … > m_TextureList };
Proxy(대리 객체를 통한 작업 수행) 다른 객체에 접근하기 위해 중간 대리 역활를 하는 객체를 둔다.
Proxy(대리 객체를 통한 작업 수행) class Mesh{  void CreateTexture( … ){ m_pTex = TextureMng.Get( … )  } protected:  Texture* m_pTexture; }; class TextureMng{  Texture* Get( … ){  Texture* pRt = NULL;  if( IsLoad( … ) ){ pRt = new Texture( … ); pRt.push_back( … );  }  else{ pRt = m_TextureList.Find( … );  }  return pRt;  } protected:  std::list< … > m_TextureList; };
Chain of Responsibility(행위 개선을 위한 패턴) 메시지를 보내는 객체와 이를 받아 처리하는 객체들 간의 결합도를 없애기 위한 패턴이다.하나의 요청에 대한 처리가 반드시 한 객체에서만 이루어지지 않고, 여러 객체에게 그 처리의기회를 주려는 것이다. 즉, 이 패턴에서는 하나의 서비스 처리를 여러 객체에 나눌 수 있도록한다. 메시지를 수신하여 처리를 담당할 객체들을 하나의 연결 고리로 만들고, 실제로 요청을처리하는 객체를 만날 때까지 계속해서 요청을 전달하게 한다.
Chain of Responsibility(행위 개선을 위한 패턴) class UI{  UI( UI* pHelp ){ … }  void ShowHelp(){ m_pHelp->Show();  };  UI* m_pHelp; }; class UIHelpMain : public UI{ }; class UIHelpOption : public UI{ }; class UIMain{};  class UIInventory{}; class UIOption{}; UIHelpMainuIHelpMain; UIHelpOptionuHelpOption; UIMainuUIMain(&uUIHelpMain); UIInventoryuUIInventory(& uUIHelpMain); UIOptionuUIOption(& uHelpOption)
Command(수행할 작업의 일반화를 통한 조작) 요청 자체를 객체화하는 것이다. 그리고 서로 다른 요청을 객체화하여 클라이언트에게 파라미터로 넘겨줄 수 있게한다.
Command(수행할 작업의 일반화를 통한 조작) class Mesh{  void Render(){ … }; }; class Particle{  void Draw(){ … }; }; class RD{  virtual void Render() = 0; }; class RD_Mesh{ RD_Mesh( Mesh* p ){ … }  void Render(){ m_p->Render(); } }; class RD_Particle{ RD_Particle( Particle* p ){ … }  void Render(){ m_p->Draw(); } };
Interpreter(간단한 문법에 기반한 검증 및 작업 처리) 어떤 언어는 문법에 대한 표현을 정의하면서 그 언어로 기술된 문장을 해석하는 기법을 표현하기 위해서 인터프리터도 함께 정의하는 경우가 있다.
Interpreter(간단한 문법에 기반한 검증 및 작업 처리) class Paser{ } class PaserXML : Paser{… } class PaserBinary : Paser{… }
Iterator(동일 자료형의 여러 객체 순차 접근) 복합 객체 요소들의 내부 표현 방식을 공개하지 않고도 순차적으로 접근할 수 있는 방법을 제공한다.
Iterator(동일 자료형의 여러 객체 순차 접근) class LinkList{ structstData{ stData* m_pNext; intm_iData;  }; LinkListIterGetIterator(){   return LinkListIter( m_pFirst );  }; stData* m_pFirst; }; class LinkListIter{ LinkListIter( LinkList::stData* p ){ m_pData = p;  }; intGetData(){   return m_pData->m_iData;  };  void Next(){ m_pData=m_pData->m_pNext;  }; stData* m_pData; };
Mediator(M:N객체 관계를 M:1로 단순화) 객체들 간의 상호작용을 캡슐화하여 하나의 객체 안에 정의한다. Mediator 패턴은 각 객체가 관련성을 갖는 다른 객체에 대한 참조 관계를 직접 정의하기보다는 이를 독립된 다른 객체가 관리하게 한다.
Mediator(M:N객체 관계를 M:1로 단순화) class UI{  void Notify(){   m_pMessagePump->Notify( … );  } }; class MessagePump{  void Notify( … ){  } };
Memento(객체의 이전 상태 복원 또는 보관) 캡슐화를 위배하지 않으면서 객체의 내부 상태를 파악하고 표현함으로써 객체의 상태를 저장해둔 상태로 다시 복구 할 수 있게 한다.
Memento(객체의 이전 상태 복원 또는 보관) class History{  void SetData( … ){ … } HistoryData* m_pData; }; class HistoryData{ … }; class HistoryCreate{  static History* sCreate( HistoryData* pData ){  History* p = new History;  p->SetData(pData );  } }; class Tool{  void Push( History* pHistory ){  … }  History* Pop(){ … } std::deque<HistoryData*> m_List; }; Tool tool; tool.Push( HistoryCreate::sCreate( … );
Observer(One Source Multiple Use) 일대다의 관련성을 갖는 객체들의 경우 한 객체의 상태가 변하면 다른 모든 객체에 그 사항을 알리고 필요한 수정이 자동으로 이루어지도록 할 수 있어야 한다.
Observer(One Source Multiple Use) class Party{  static void sAdd( intiGroup, Player*p ){  …   }  static void sSay( intiGroup, const* char strMsg ){  …  } protected:  std::map<int, Player*> m_Player; }; class Player{  void CreateParty( intiParty ){ m_iParty = iParty;   Party::sAdd( m_iParty, this );  }  void SayParty( const* strMsg ){   Party::sSay( m_iParty, strMsg );  }; protected: intm_iParty; };
State(객체상태 추가 시 행위 수행의 원활한 변경) 객체 자신의 내부 상태에 따라 행위를 변경하도록 한다. 객체가 클래스를 바꾸는 것처럼 보일수 있다.
State(객체상태 추가 시 행위 수행의 원활한 변경) class Player{  State* m_pCurrent;  State* m_pNext;  void Tick(){ m_pCurrent->Tick();   …  };  void NextState( … ){ … } }; class State{  void SetPlayer( … ){ … }  Player* m_pPlayer; }; class StateWalk : public State{  void Tick(){   if( key[ space ] == ture ){ m_pPlayer-> NextState( StateRun );   };  } }; class StateRun : public State{  void Tick( … ){ … } };
Strategy(동일 목적의 여러 알고리즘 중 선택해서 적용) 다양한 알고리즘이 존재하면 이들 각각을 하나의 클래스로 캡슐화하여 알고리즘의 대체가 가능하도록 한다. Strategy패턴을 이용하면 클라이언트와 독립적인 다양한 알고리즘으로 변형할 수있다. 알고리즘을 바구더라도 클라이언트는 아무런 변경을 할 필요가 없다.
Strategy(동일 목적의 여러 알고리즘 중 선택해서 적용) class VB{ }; class VideoVB : public VB{  void Render( … ); }; class  SystemVB: public VB{  void Render( … ); }; class Mesh{  void SetVB( VB* pVB ); };
Template Method(알고리즘의 기본 골격 재사용 및 상세 구현 변경) 오퍼레이션에 알고리즘의 기본 골격 구조를 정의하고 구체적인 단계는 서브클래스에 정의한다.Template Method 클래스의 서브클래스는 알고리즘의 구조를 변경하지 않고 알고리즘 처리단계들을 재정의 할 수 있다.
Template Method(알고리즘의 기본 골격 재사용 및 상세 구현 변경) class Base{  virtual void Tick( … ) = 0;  virtual void Render( … ) = 0; }; class Mesh : public Base{  virtual void Tick( … ) { … }  virtual void Render( … ) { … }; }; class Particle : public Base{  virtual void Tick( … ) { … }  virtual void Render( … ) { … }; };
Visitor(작업 종류의 효율적 추가,변경) 객체 구조의 요소들에 수행할 오퍼레이션을 표한한 패턴이다. Visitor 패턴은 오퍼레이션이 처리할 요소의 클래스를 변경하지 않고도 새로운 오퍼레이션을정의 할 수 있게한다.
Visitor(작업 종류의 효율적 추가,변경) class Geo{ }; class GeoComposite{  std::list< Geo* > m_List; }; class GeoRender{  void Draw( GeoComposite* pGeoComposite); }; class GeoRenderInstancing{  void Draw( GeoComposite* pGeoComposite); };

Weitere ähnliche Inhalte

Was ist angesagt?

파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310Yong Joon Moon
 
파이썬 객체 클래스 이해하기
파이썬  객체 클래스 이해하기파이썬  객체 클래스 이해하기
파이썬 객체 클래스 이해하기Yong Joon Moon
 
Java programming pdf
Java programming pdfJava programming pdf
Java programming pdfJi Hoon Lee
 
파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기 파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기 Yong Joon Moon
 
파이썬 Special method 이해하기
파이썬 Special method 이해하기파이썬 Special method 이해하기
파이썬 Special method 이해하기Yong Joon Moon
 
파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기Yong Joon Moon
 
파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기Yong Joon Moon
 
파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409Yong Joon Moon
 
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It종빈 오
 
파이썬 iterator generator 이해하기
파이썬 iterator generator 이해하기파이썬 iterator generator 이해하기
파이썬 iterator generator 이해하기Yong Joon Moon
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229Yong Joon Moon
 
파이썬+객체지향+이해하기 20160131
파이썬+객체지향+이해하기 20160131파이썬+객체지향+이해하기 20160131
파이썬+객체지향+이해하기 20160131Yong Joon Moon
 
Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713Yong Joon Moon
 
파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304Yong Joon Moon
 
Jupyter notebook 이해하기
Jupyter notebook 이해하기 Jupyter notebook 이해하기
Jupyter notebook 이해하기 Yong Joon Moon
 
파이썬 xml 이해하기
파이썬 xml 이해하기파이썬 xml 이해하기
파이썬 xml 이해하기Yong Joon Moon
 

Was ist angesagt? (20)

파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310파이썬+클래스+구조+이해하기 20160310
파이썬+클래스+구조+이해하기 20160310
 
파이썬 객체 클래스 이해하기
파이썬  객체 클래스 이해하기파이썬  객체 클래스 이해하기
파이썬 객체 클래스 이해하기
 
Java programming pdf
Java programming pdfJava programming pdf
Java programming pdf
 
파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기 파이썬 namespace Binding 이해하기
파이썬 namespace Binding 이해하기
 
파이썬 Special method 이해하기
파이썬 Special method 이해하기파이썬 Special method 이해하기
파이썬 Special method 이해하기
 
파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기파이썬 class 및 function namespace 이해하기
파이썬 class 및 function namespace 이해하기
 
파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기파이썬 반복자 생성자 이해하기
파이썬 반복자 생성자 이해하기
 
파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409파이썬+Operator+이해하기 20160409
파이썬+Operator+이해하기 20160409
 
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
[WELC] 22. I Need to Change a Monster Method and I Can’t Write Tests for It
 
파이썬 심화
파이썬 심화파이썬 심화
파이썬 심화
 
파이썬 iterator generator 이해하기
파이썬 iterator generator 이해하기파이썬 iterator generator 이해하기
파이썬 iterator generator 이해하기
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229파이썬+함수이해하기 20160229
파이썬+함수이해하기 20160229
 
Java start01 in 2hours
Java start01 in 2hoursJava start01 in 2hours
Java start01 in 2hours
 
파이썬+객체지향+이해하기 20160131
파이썬+객체지향+이해하기 20160131파이썬+객체지향+이해하기 20160131
파이썬+객체지향+이해하기 20160131
 
Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713Processing 기초 이해하기_20160713
Processing 기초 이해하기_20160713
 
파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304파이썬+주요+용어+정리 20160304
파이썬+주요+용어+정리 20160304
 
Jupyter notebook 이해하기
Jupyter notebook 이해하기 Jupyter notebook 이해하기
Jupyter notebook 이해하기
 
javascript03
javascript03javascript03
javascript03
 
파이썬 xml 이해하기
파이썬 xml 이해하기파이썬 xml 이해하기
파이썬 xml 이해하기
 

Andere mochten auch

Gdc2003 Will Wright
Gdc2003 Will WrightGdc2003 Will Wright
Gdc2003 Will Wrightgeoffhom
 
6강 light shadow 기초
6강 light shadow 기초6강 light shadow 기초
6강 light shadow 기초JP Jung
 
Intro to unreal with framework and vr
Intro to unreal with framework and vrIntro to unreal with framework and vr
Intro to unreal with framework and vrLuis Cataldi
 
C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부Gwangwhi Mah
 
언차티드4 테크아트 파트3 MicroShadowBRDF Term
언차티드4 테크아트 파트3 MicroShadowBRDF Term언차티드4 테크아트 파트3 MicroShadowBRDF Term
언차티드4 테크아트 파트3 MicroShadowBRDF TermDae Hyek KIM
 
언차티드4 테크아트 파트4 Special Case Materials - Moss & Wetness & Glass
언차티드4 테크아트 파트4 Special Case Materials - Moss & Wetness & Glass언차티드4 테크아트 파트4 Special Case Materials - Moss & Wetness & Glass
언차티드4 테크아트 파트4 Special Case Materials - Moss & Wetness & GlassDae Hyek KIM
 
Luis cataldi-ue4-vr-best-practices2
Luis cataldi-ue4-vr-best-practices2Luis cataldi-ue4-vr-best-practices2
Luis cataldi-ue4-vr-best-practices2Luis Cataldi
 
언차티드4 테크아트 파트5 Vertex Processing
언차티드4 테크아트 파트5 Vertex Processing언차티드4 테크아트 파트5 Vertex Processing
언차티드4 테크아트 파트5 Vertex ProcessingDae Hyek KIM
 
Hair animation by vertex shader
Hair animation by vertex shaderHair animation by vertex shader
Hair animation by vertex shader동석 김
 
Making VR games and experiences in Unreal Engine
Making VR games and experiences in Unreal EngineMaking VR games and experiences in Unreal Engine
Making VR games and experiences in Unreal EngineLuis Cataldi
 
NDC 2015 박주은,최재혁 물리기반렌더링 지난1년간의 경험
NDC 2015 박주은,최재혁 물리기반렌더링 지난1년간의 경험NDC 2015 박주은,최재혁 물리기반렌더링 지난1년간의 경험
NDC 2015 박주은,최재혁 물리기반렌더링 지난1년간의 경험Jooeun Park
 
3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초Seung Joon Choi
 
물리 기반 셰이더의 이해
물리 기반 셰이더의 이해물리 기반 셰이더의 이해
물리 기반 셰이더의 이해tartist
 
Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기JP Jung
 
유니티+유니티서비스
유니티+유니티서비스유니티+유니티서비스
유니티+유니티서비스GukHwan Ji
 
물리기반렌더링 알레고리드믹 한국어 번역
물리기반렌더링 알레고리드믹 한국어 번역물리기반렌더링 알레고리드믹 한국어 번역
물리기반렌더링 알레고리드믹 한국어 번역Dae Hyek KIM
 
언리얼 엔진 4용 커스텀 천 재질
언리얼 엔진 4용 커스텀 천 재질언리얼 엔진 4용 커스텀 천 재질
언리얼 엔진 4용 커스텀 천 재질동석 김
 
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기동석 김
 
Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더동석 김
 
버텍스 셰이더로 하는 머리카락 애니메이션
버텍스 셰이더로 하는 머리카락 애니메이션버텍스 셰이더로 하는 머리카락 애니메이션
버텍스 셰이더로 하는 머리카락 애니메이션동석 김
 

Andere mochten auch (20)

Gdc2003 Will Wright
Gdc2003 Will WrightGdc2003 Will Wright
Gdc2003 Will Wright
 
6강 light shadow 기초
6강 light shadow 기초6강 light shadow 기초
6강 light shadow 기초
 
Intro to unreal with framework and vr
Intro to unreal with framework and vrIntro to unreal with framework and vr
Intro to unreal with framework and vr
 
C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부C++ 11 에 대해서 쉽게 알아봅시다 1부
C++ 11 에 대해서 쉽게 알아봅시다 1부
 
언차티드4 테크아트 파트3 MicroShadowBRDF Term
언차티드4 테크아트 파트3 MicroShadowBRDF Term언차티드4 테크아트 파트3 MicroShadowBRDF Term
언차티드4 테크아트 파트3 MicroShadowBRDF Term
 
언차티드4 테크아트 파트4 Special Case Materials - Moss & Wetness & Glass
언차티드4 테크아트 파트4 Special Case Materials - Moss & Wetness & Glass언차티드4 테크아트 파트4 Special Case Materials - Moss & Wetness & Glass
언차티드4 테크아트 파트4 Special Case Materials - Moss & Wetness & Glass
 
Luis cataldi-ue4-vr-best-practices2
Luis cataldi-ue4-vr-best-practices2Luis cataldi-ue4-vr-best-practices2
Luis cataldi-ue4-vr-best-practices2
 
언차티드4 테크아트 파트5 Vertex Processing
언차티드4 테크아트 파트5 Vertex Processing언차티드4 테크아트 파트5 Vertex Processing
언차티드4 테크아트 파트5 Vertex Processing
 
Hair animation by vertex shader
Hair animation by vertex shaderHair animation by vertex shader
Hair animation by vertex shader
 
Making VR games and experiences in Unreal Engine
Making VR games and experiences in Unreal EngineMaking VR games and experiences in Unreal Engine
Making VR games and experiences in Unreal Engine
 
NDC 2015 박주은,최재혁 물리기반렌더링 지난1년간의 경험
NDC 2015 박주은,최재혁 물리기반렌더링 지난1년간의 경험NDC 2015 박주은,최재혁 물리기반렌더링 지난1년간의 경험
NDC 2015 박주은,최재혁 물리기반렌더링 지난1년간의 경험
 
3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초3D 컴퓨터 그래픽스 기초
3D 컴퓨터 그래픽스 기초
 
물리 기반 셰이더의 이해
물리 기반 셰이더의 이해물리 기반 셰이더의 이해
물리 기반 셰이더의 이해
 
Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기Unity3D로 풀3D web mmorpg 만들기
Unity3D로 풀3D web mmorpg 만들기
 
유니티+유니티서비스
유니티+유니티서비스유니티+유니티서비스
유니티+유니티서비스
 
물리기반렌더링 알레고리드믹 한국어 번역
물리기반렌더링 알레고리드믹 한국어 번역물리기반렌더링 알레고리드믹 한국어 번역
물리기반렌더링 알레고리드믹 한국어 번역
 
언리얼 엔진 4용 커스텀 천 재질
언리얼 엔진 4용 커스텀 천 재질언리얼 엔진 4용 커스텀 천 재질
언리얼 엔진 4용 커스텀 천 재질
 
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기
 
Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더
 
버텍스 셰이더로 하는 머리카락 애니메이션
버텍스 셰이더로 하는 머리카락 애니메이션버텍스 셰이더로 하는 머리카락 애니메이션
버텍스 셰이더로 하는 머리카락 애니메이션
 

Ähnlich wie Design patterns

Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)문익 장
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기jongho jeong
 
Clean code
Clean codeClean code
Clean codebbongcsu
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Sangon Lee
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나Astin Choi
 
Android Programming
Android ProgrammingAndroid Programming
Android ProgrammingJake Yoon
 
Android Programming - Input
Android Programming - InputAndroid Programming - Input
Android Programming - InputJake Yoon
 
Policy based Class Design
Policy based Class DesignPolicy based Class Design
Policy based Class Designlactrious
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장tedypicker
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴Jaeho Seok
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계Chiwon Song
 
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)탑크리에듀(구로디지털단지역3번출구 2분거리)
 
자바스터디(6기) 4
자바스터디(6기) 4자바스터디(6기) 4
자바스터디(6기) 4Jina Lee
 
CRUD Pattern in Ajax
CRUD Pattern in AjaxCRUD Pattern in Ajax
CRUD Pattern in AjaxRhio Kim
 
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3suitzero
 
5장 객체와클래스
5장 객체와클래스5장 객체와클래스
5장 객체와클래스SeoYeong
 

Ähnlich wie Design patterns (20)

Effective c++(chapter 5,6)
Effective c++(chapter 5,6)Effective c++(chapter 5,6)
Effective c++(chapter 5,6)
 
Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기Javascript 조금 더 잘 알기
Javascript 조금 더 잘 알기
 
Clean code
Clean codeClean code
Clean code
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 
react-ko.pdf
react-ko.pdfreact-ko.pdf
react-ko.pdf
 
Ai C#세미나
Ai C#세미나Ai C#세미나
Ai C#세미나
 
Android Programming
Android ProgrammingAndroid Programming
Android Programming
 
Android Programming - Input
Android Programming - InputAndroid Programming - Input
Android Programming - Input
 
Policy based Class Design
Policy based Class DesignPolicy based Class Design
Policy based Class Design
 
120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장120908 레거시코드활용전략 4장5장
120908 레거시코드활용전략 4장5장
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴[0820 석재호]headfirst디자인패턴
[0820 석재호]headfirst디자인패턴
 
Swt J Face 2/3
Swt J Face 2/3Swt J Face 2/3
Swt J Face 2/3
 
20201121 코드 삼분지계
20201121 코드 삼분지계20201121 코드 삼분지계
20201121 코드 삼분지계
 
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
 
Coded ui가이드
Coded ui가이드Coded ui가이드
Coded ui가이드
 
자바스터디(6기) 4
자바스터디(6기) 4자바스터디(6기) 4
자바스터디(6기) 4
 
CRUD Pattern in Ajax
CRUD Pattern in AjaxCRUD Pattern in Ajax
CRUD Pattern in Ajax
 
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3
 
5장 객체와클래스
5장 객체와클래스5장 객체와클래스
5장 객체와클래스
 

Design patterns

  • 2. 참고자료 GoF디자인패턴! 이렇게 활용한다 http://code1009.tistory.com/category/셈말짓기/GoF http://www.mcdonaldland.info/files/designpatterns/designpatternscard.pdf http://www.dofactory.com/Patterns/Patterns.aspx http://elky.tistory.com/category/소프트웨어%20개발
  • 3. Abstract Factory(제품(Product)별 객체 생성) 구체적 클래스를 정의하지 않고도 서로 관련성이 있거나 독립적인 여러 객체의 군을 생성하기위한 인터페이스를 제공한다.
  • 4. Abstract Factory(제품(Product)별 객체 생성) class Device{}; class DeviceGraphics : Device { Grahpics* CreateWindows(); Grahpics* CreateLinux(); } class DeviceSound : Device { … } class Engine{ Grahpics* CreateGraphics(); Sound* CreateSound(); } class EngineWindows : Engine{ Graphics* CreateGraphics(){ return DeviceGraphics->CreateWindow(); } Sound* CreateSound(){ … } };
  • 5. Builder(부분 부분 생성을 통한 전체 객체 생성) 복잡한 객체를 생성하는 방법과 표현하는 방법을 정의하는 클래스를 별도로 분리하여 서로 다른 표현이라도 이를 생성할 수 있는 동일한 구축 공정을 제공할 수 있도록 한다.
  • 6. Builder(부분 부분 생성을 통한 전체 객체 생성) class NPC{ void SetHP( … ){ … }; void SetSP( … ){ … }; }; void NPCBuilder{ virtual void SetHP() { … } virtual void SetSP() { … }; NPC* m_pNPC; } class NPCBuilder1 : NPCBuilder{ virtual void SetHP() { m_pNPC->SetHP( 100 ); } virtual void SetSP() { m_pNPC->SetSP( 100 ); }; } class NPCBuilder2 : NPCBuilder{ … } void Stage{ void Create( NPCBuilder* pNPCBuilder ){ pNPCBuilder->SetHP(); pNPCBuilder->SetSP(); } };
  • 7. Factory Method(대행 함수를 통한 객체 생성) 객체를 생성하기 위해 인터페이스를 정의하지만, 어떤 클래스의 인스턴스를 생성할지에 대한결정은 서브클래스에서 이루어지도록 Factory Method 패턴은 서브클래스에게 인스턴스 생성의 책임을 미룬다.
  • 8. Factory Method(대행 함수를 통한 객체 생성) class App { virtual View* CreateView() = 0; }; class View { }; class MyApp : public App{ View* CreateView(){ return new MyView; } }; class MyView : public View{ };
  • 9. Prototype(복제를 통한 객체 생성) 견본적(prototypical) 인스턴스를 사용하여 생성할 객체의 종류를 명시하고 이렇게 만들어진견본을 복사해서 새로운 객체를 생성한다.
  • 10. Prototype(복제를 통한 객체 생성) class NPC{ virtual NPC* Clone() = 0; NPC( const NPC& npc ){ … } }; class NPC_1{ virtual NPC* Clone(){ return new NPC_1( *this ); } }; NPC* p1 = new NPC_1; NPC* p2 = p1->Clone();
  • 11. Singleton(최대 N개까지로 객체생성을 제한) 클래스에서 만들 수 있는 인스턴스가 오직 하나일 경우에 이에 대한 접근은 어디에서든지 하나로만 통일하여 제공한다.
  • 12. Singleton(최대 N개까지로 객체생성을 제한) //개수제한 class NPC{ static ints_iTotalCount = 20; static NPC* CreateNPC(){ … } static void DeleteNPC(){ … } protected: NPC(){} NPC( const NPC& npc ){ ... } }; //단일객체 class NPCMng { static NPCMngGetInstance(){ return s_Instance; }; protected: static NPCMngs_Istance; NPCMng(){} NPCMng(const NPCMng &p )(){} };
  • 13. Adapter(기존 모듈 재사용을 위한 인터페이스 변경) 클래스의 인터페이스를 클라이언트가 기대하는 형태의 인터페이스로 변환한다.어댑터 패턴은 서로 일치하지 않는 인터페이스를 갖는 클래스들을 함께 작동 시킨다.
  • 14. Adapter(기존 모듈 재사용을 위한 인터페이스 변경) //현재버전 class Font { virtual SIZE GetSize(){ … } }; //새버전 class Font { virtual FontSizeGetSize(){ … } }; //개선 class GFont{ void SIZE GetSize(){ FontSize Size=m_Font.GetSize(); return SIZE( Size.x, Size.y ); } protected: Font m_Font; };
  • 15. Bridge(인터페이스와 구현의 명확한 분리) 구현과 추상화 개념을 분리하려는 것이다. 이로써 구현 자체도 하나의 추상화 개념으로 다양한 변형이 가능해지고, 구현과 독립적으로 인터페이스도 다양함을 가질 수 있게 된다.
  • 16. Bridge(인터페이스와 구현의 명확한 분리) class Graphics{ virtual void DrawShape() = 0; }; class GraphicsDX9 : Graphics{ virtual void DrawPrimitive(){ … }; } class GraphicsDX10 : Graphics{ virtual void DrawPrimitive(){ … }; } class Engine{ void DrawShape(){ m_pGraphics->DrawShape(); } };
  • 17. Composite(객체간의 부분-전체 관계 형성 및 관리) 부분-전체 계층을 나타내기 위한 복합 객체를 트리 구조로 만든다.Composite 패턴은 클라이언트가 개별적 객체와 복합 객체 모두를 동일하게 다루도록 한다.
  • 18. Composite(객체간의 부분-전체 관계 형성 및 관리) class Base{ }; class Entity : Base{ }; class Node : Base{ std::list< Base* > m_BaseList; };
  • 19. Decorator(객체의 기능을 동적으로 추가,삭제) 객체에 동적으로 새로운 서비스를 추가할 수 있게 한다. Decorator패턴은 기능의 추가를 위해서 서브클래스를 생성하는 것보다 융통성 있는 방법을 제공한다.
  • 20. Decorator(객체의 기능을 동적으로 추가,삭제) class UI{}; class Window : UI{}; class CheckBox : Window{}; class Button : CheckBox{}; class RadioButton : Window{ CheckBox* m_pCheckBox; }
  • 21. Facade(서브시스템의 명확한 구분 정의) 서브시스템을 합성하는 다수의 객체들의 인터페이스 집합에 대해 일관된 하나의 인터페이스를 제공할 수 있게 한다. Facade는 서브시스템을 사용하기 쉽게 하기 위한 포괄적 개념의 인터페이스를 정의 한다.
  • 22. Facade(서브시스템의 명확한 구분 정의) class Graphics{}; … class Sound{}; … class Input{}; //현재 Graphics* pG = new Graphics; … Sound* pS = new Sound; … Input* pI = new Input //개선 class Engine { void Create(){ m_pG = new Graphics; m_pS = new Sound; m_pI = new Input;c } Protected: Graphics* m_pG; Sound* m_pS; Input* m_pI; };
  • 23. Flyweight(작은객체들의 공유) 대규모의 미세한 객체들을 효과적으로 사용하기 위해서는 공유 개념을 도입
  • 24. Flyweight(작은객체들의 공유) class Mesh{ void CreateTexture( … ){ Texture* pRt = NULL; if( IsLoadTexture ( … ) ){ pRt = new Texture( … ); pRt.push_back( … ); } else{ pRt = m_TextureList.Find( … ); } m_pTexture = pRt; } protected: Texture* m_pTexture; std::list< … > m_TextureList };
  • 25. Proxy(대리 객체를 통한 작업 수행) 다른 객체에 접근하기 위해 중간 대리 역활를 하는 객체를 둔다.
  • 26. Proxy(대리 객체를 통한 작업 수행) class Mesh{ void CreateTexture( … ){ m_pTex = TextureMng.Get( … ) } protected: Texture* m_pTexture; }; class TextureMng{ Texture* Get( … ){ Texture* pRt = NULL; if( IsLoad( … ) ){ pRt = new Texture( … ); pRt.push_back( … ); } else{ pRt = m_TextureList.Find( … ); } return pRt; } protected: std::list< … > m_TextureList; };
  • 27. Chain of Responsibility(행위 개선을 위한 패턴) 메시지를 보내는 객체와 이를 받아 처리하는 객체들 간의 결합도를 없애기 위한 패턴이다.하나의 요청에 대한 처리가 반드시 한 객체에서만 이루어지지 않고, 여러 객체에게 그 처리의기회를 주려는 것이다. 즉, 이 패턴에서는 하나의 서비스 처리를 여러 객체에 나눌 수 있도록한다. 메시지를 수신하여 처리를 담당할 객체들을 하나의 연결 고리로 만들고, 실제로 요청을처리하는 객체를 만날 때까지 계속해서 요청을 전달하게 한다.
  • 28. Chain of Responsibility(행위 개선을 위한 패턴) class UI{ UI( UI* pHelp ){ … } void ShowHelp(){ m_pHelp->Show(); }; UI* m_pHelp; }; class UIHelpMain : public UI{ }; class UIHelpOption : public UI{ }; class UIMain{}; class UIInventory{}; class UIOption{}; UIHelpMainuIHelpMain; UIHelpOptionuHelpOption; UIMainuUIMain(&uUIHelpMain); UIInventoryuUIInventory(& uUIHelpMain); UIOptionuUIOption(& uHelpOption)
  • 29. Command(수행할 작업의 일반화를 통한 조작) 요청 자체를 객체화하는 것이다. 그리고 서로 다른 요청을 객체화하여 클라이언트에게 파라미터로 넘겨줄 수 있게한다.
  • 30. Command(수행할 작업의 일반화를 통한 조작) class Mesh{ void Render(){ … }; }; class Particle{ void Draw(){ … }; }; class RD{ virtual void Render() = 0; }; class RD_Mesh{ RD_Mesh( Mesh* p ){ … } void Render(){ m_p->Render(); } }; class RD_Particle{ RD_Particle( Particle* p ){ … } void Render(){ m_p->Draw(); } };
  • 31. Interpreter(간단한 문법에 기반한 검증 및 작업 처리) 어떤 언어는 문법에 대한 표현을 정의하면서 그 언어로 기술된 문장을 해석하는 기법을 표현하기 위해서 인터프리터도 함께 정의하는 경우가 있다.
  • 32. Interpreter(간단한 문법에 기반한 검증 및 작업 처리) class Paser{ } class PaserXML : Paser{… } class PaserBinary : Paser{… }
  • 33. Iterator(동일 자료형의 여러 객체 순차 접근) 복합 객체 요소들의 내부 표현 방식을 공개하지 않고도 순차적으로 접근할 수 있는 방법을 제공한다.
  • 34. Iterator(동일 자료형의 여러 객체 순차 접근) class LinkList{ structstData{ stData* m_pNext; intm_iData; }; LinkListIterGetIterator(){ return LinkListIter( m_pFirst ); }; stData* m_pFirst; }; class LinkListIter{ LinkListIter( LinkList::stData* p ){ m_pData = p; }; intGetData(){ return m_pData->m_iData; }; void Next(){ m_pData=m_pData->m_pNext; }; stData* m_pData; };
  • 35. Mediator(M:N객체 관계를 M:1로 단순화) 객체들 간의 상호작용을 캡슐화하여 하나의 객체 안에 정의한다. Mediator 패턴은 각 객체가 관련성을 갖는 다른 객체에 대한 참조 관계를 직접 정의하기보다는 이를 독립된 다른 객체가 관리하게 한다.
  • 36. Mediator(M:N객체 관계를 M:1로 단순화) class UI{ void Notify(){ m_pMessagePump->Notify( … ); } }; class MessagePump{ void Notify( … ){ } };
  • 37. Memento(객체의 이전 상태 복원 또는 보관) 캡슐화를 위배하지 않으면서 객체의 내부 상태를 파악하고 표현함으로써 객체의 상태를 저장해둔 상태로 다시 복구 할 수 있게 한다.
  • 38. Memento(객체의 이전 상태 복원 또는 보관) class History{ void SetData( … ){ … } HistoryData* m_pData; }; class HistoryData{ … }; class HistoryCreate{ static History* sCreate( HistoryData* pData ){ History* p = new History; p->SetData(pData ); } }; class Tool{ void Push( History* pHistory ){ … } History* Pop(){ … } std::deque<HistoryData*> m_List; }; Tool tool; tool.Push( HistoryCreate::sCreate( … );
  • 39. Observer(One Source Multiple Use) 일대다의 관련성을 갖는 객체들의 경우 한 객체의 상태가 변하면 다른 모든 객체에 그 사항을 알리고 필요한 수정이 자동으로 이루어지도록 할 수 있어야 한다.
  • 40. Observer(One Source Multiple Use) class Party{ static void sAdd( intiGroup, Player*p ){ … } static void sSay( intiGroup, const* char strMsg ){ … } protected: std::map<int, Player*> m_Player; }; class Player{ void CreateParty( intiParty ){ m_iParty = iParty; Party::sAdd( m_iParty, this ); } void SayParty( const* strMsg ){ Party::sSay( m_iParty, strMsg ); }; protected: intm_iParty; };
  • 41. State(객체상태 추가 시 행위 수행의 원활한 변경) 객체 자신의 내부 상태에 따라 행위를 변경하도록 한다. 객체가 클래스를 바꾸는 것처럼 보일수 있다.
  • 42. State(객체상태 추가 시 행위 수행의 원활한 변경) class Player{ State* m_pCurrent; State* m_pNext; void Tick(){ m_pCurrent->Tick(); … }; void NextState( … ){ … } }; class State{ void SetPlayer( … ){ … } Player* m_pPlayer; }; class StateWalk : public State{ void Tick(){ if( key[ space ] == ture ){ m_pPlayer-> NextState( StateRun ); }; } }; class StateRun : public State{ void Tick( … ){ … } };
  • 43. Strategy(동일 목적의 여러 알고리즘 중 선택해서 적용) 다양한 알고리즘이 존재하면 이들 각각을 하나의 클래스로 캡슐화하여 알고리즘의 대체가 가능하도록 한다. Strategy패턴을 이용하면 클라이언트와 독립적인 다양한 알고리즘으로 변형할 수있다. 알고리즘을 바구더라도 클라이언트는 아무런 변경을 할 필요가 없다.
  • 44. Strategy(동일 목적의 여러 알고리즘 중 선택해서 적용) class VB{ }; class VideoVB : public VB{ void Render( … ); }; class SystemVB: public VB{ void Render( … ); }; class Mesh{ void SetVB( VB* pVB ); };
  • 45. Template Method(알고리즘의 기본 골격 재사용 및 상세 구현 변경) 오퍼레이션에 알고리즘의 기본 골격 구조를 정의하고 구체적인 단계는 서브클래스에 정의한다.Template Method 클래스의 서브클래스는 알고리즘의 구조를 변경하지 않고 알고리즘 처리단계들을 재정의 할 수 있다.
  • 46. Template Method(알고리즘의 기본 골격 재사용 및 상세 구현 변경) class Base{ virtual void Tick( … ) = 0; virtual void Render( … ) = 0; }; class Mesh : public Base{ virtual void Tick( … ) { … } virtual void Render( … ) { … }; }; class Particle : public Base{ virtual void Tick( … ) { … } virtual void Render( … ) { … }; };
  • 47. Visitor(작업 종류의 효율적 추가,변경) 객체 구조의 요소들에 수행할 오퍼레이션을 표한한 패턴이다. Visitor 패턴은 오퍼레이션이 처리할 요소의 클래스를 변경하지 않고도 새로운 오퍼레이션을정의 할 수 있게한다.
  • 48. Visitor(작업 종류의 효율적 추가,변경) class Geo{ }; class GeoComposite{ std::list< Geo* > m_List; }; class GeoRender{ void Draw( GeoComposite* pGeoComposite); }; class GeoRenderInstancing{ void Draw( GeoComposite* pGeoComposite); };