SlideShare a Scribd company logo
디자인 패턴 스터디
VISITOR, STATE, FINITE STATE MACHINE
VISITOR PATTERN
VISITOR PATTERN 언제 쓰는가
• 의도: 클래스를 변경하지 않고 새로운 작업을 정의하는 방법
• 서로 다른 object 들이 모여 있는 배열, 트리, 또는 맵과 같은 집합이 있는데
• 각 object에 대해서 수행할 작업이 존재한다.
• 하지만 각 object 내에서 해당 작업에 대한 코드를 넣고 싶지 않을때
• 그렇다고 각 object의 type을 식별해서 casting 하고 싶지 않을때
• VISITOR PATTERN이 구현된 코드를 통해서 살펴보겠습니다
VISITOR PATTERN 구조
VISITOR PATTERN 구현 예제
• ELEMENT 추상 클래스
• 자연의 원소(element)들을 이용한 skill을 가지고 게임을 한다고 가정한다
• 원소는 Water, Fire, Air가 있다고 하자
• WATER, FIRE, AIR 클래스는 ELEMENT를 상속받음
• VISITOR 추상 클래스
• Water, Fire, Air에 대해서 visit() 함수를 구현할 수 있도록 virtual 함수 선언
• GET_SKILL_VISITOR 클래스 (VISITOR 상속)
• 각 Element를 획득했을 때 실행될 함수들을 구현
• LOSE_SKILL_VISITOR 클래스 (VISITOR 상속)
• 각 Element를 잃었을 때 실행될 함수들을 구현
ELEMENT 추상 클래스
// ELEMENT 추상 클래스
class Element
{
public:
virtual void Accept(Visitor& v) = 0; // 자식들이 Visitor를 받을 수 있도록
virtual void ToString() = 0; // 이건 그냥 화면에 보여주기 위함
};
ELEMENT 구현 클래스들
class Water : public Element
{
public:
void Accept(Visitor &v) { v.visit(this); }
void ToString() { printf_s("Watern"); }
};
class Fire : public Element
{
public:
void Accept(Visitor& v) { v.visit(this); }
void ToString() { printf_s("Firen"); }
};
class Air : public Element
{
public:
void Accept(Visitor& v) { v.visit(this); }
void ToString() { printf_s("Airn"); }
};
VISITOR 추상 클래스
class Visitor
{
public: // 입력 받을 각 클래스에 따라서 함수 선언
virtual void visit(class Water* element) = 0;
virtual void visit(class Fire* element) = 0;
virtual void visit(class Air* element) = 0;
};
VISITOR 구현 클래스들
class GetSkill_Visitor : public Visitor {
virtual void visit(Water* element) {
printf_s("GetSkill ");
element->ToString();
}
virtual void visit(Fire* element) {
printf_s("GetSkill ");
element->ToString();
}
virtual void visit(Air* element) {
printf_s("GetSkill ");
element->ToString();
}
};
class LoseSkill_Visitor : public Visitor {
virtual void visit(Water* element) {
printf_s("LoseSkill ");
element->ToString();
}
virtual void visit(Fire* element) {
printf_s("LoseSkill ");
element->ToString();
}
virtual void visit(Air* element) {
printf_s("LoseSkill ");
element->ToString();
}
};
MAIN 함수
Element *elementArr[] = {
new Water(), new Air(), new Fire() // 각 클래스 생성, 배열에 넣기
};
GetSkill_Visitor getSkill; // VISITOR 생성
LoseSkill_Visitor loseSkill; // VISITOR 생성
for (int i = 0; i < 3; i++)
elementArr[i]->Accept(getSkill); // GetSkill VISITOR를 배열의 각 원소에 실행
for (int i = 0; i < 3; i++)
elementArr[i]->Accept(loseSkill); // LoseSkill VISITOR를 배열의 각 원소에 실행
실행 결과
VISITOR PATTERN 장단점
• 단점:
• 새로운 클래스를 추가할 때마다, VISITOR 클래스 마다 METHOD를 추가해야 한다
• 클래스 설계 전에 VISITOR 패턴의 사용을 염두에 두고 만들어야 한다
• 이미 만들어진 코드에 적용하면 복잡해질 수 있다
• 장점:
• 클래스 마다 인터페이스가 다를 때, 각 클래스로부터 데이터 얻는 법을 캡슐화 할 수 있음
• 현재 코드가 없거나 코드를 변경할 수 없는 클래스에 대한 기능을 추가할 수 있다
• 서로 관련이 있는 작업들을 하나의 클래스로 묶을 수 있다
• 서로 관련이 없는 클래스들로부터 데이터를 모아서 처리할 수 있게 한다
STATE PATTERN
STATE PATTERN 언제 쓰는가
• 의도: state가 변하면 object의 동작이 변하도록. 마치 다른 클래스처럼 동작하도록
• 구현방법:
• Wrapper 클래스를 만들어서 외부에는 단일 인터페이스를 노출시킨다
• State 추상 클래스 정의
• State 추상 클래스를 상속받아서 각 state를 정의 및 구현한다
• 현재 state에 대한 pointer를 context 클래스에서 유지한다
• State를 바꾸기 위해서는 state pointer를 바꾼다
STATE PATTERN 구조
STATE PATTERN 구현 예제
• Player 클래스는 현재 state (super, normal)에 따라서 공격력과 방어력이 달라짐
• Player가 state를 가리키는 wrapper 클래스이며,
• 각 state별로 attack와 defend 함수들이 다르게 작동하도록 만듬
PLAYER 클래스
class Player
{
public:
void SetCurrent(State* s)
{
m_Current = s;
}
void Attack() { m_Current->Attack(); }
void Defend() { m_Current->Defend(); }
private:
class State* m_Current;
};
STATE 추상 클래스
class State
{
public:
virtual void Attack() = 0;
virtual void Defend() = 0;
};
STATE의 구현 클래스들
class SuperMode : public State
{
public:
void Attack() {
printf_s(“2x damage!!n");
}
void Defend() {
printf_s("Armor 2x!n");
}
};
class NormalMode : public State
{
public:
void Attack() {
printf_s(“1x damage...n");
}
void Defend() {
printf_s("Armor none...n");
}
};
MAIN 함수
Player myPlayer;
SuperMode superMode;
myPlayer.SetCurrent(&superMode); // 슈퍼 모드르 state 세팅
myPlayer.Attack();
myPlayer.Defend();
NormalMode normalMode;
myPlayer.SetCurrent(&normalMode); // 보통 모드로 state 변경
myPlayer.Attack();
myPlayer.Defend();
출력 결과
FINITE STATE MACHINE
FSM이 왜 필요?
• 액션 게임을 만들었다고 하자
• 플레이는 방향 키를 밑으로 누르면 앉을
수도 있고 (duck),
• B를 누르면 띌 수도 있다고 하자.
• 그리고 띄는 중에 방향 키를 밑으로 누
르면 다이빙한다고 하자
• 이를 그림으로 나타내면 좌측과 같다
FINITE STATE MACHINE 개념
• Fixed set of states
• Machine이 가질 수 있는 상태의 집합은 유한하다 (즉, 가능한 상태들이 정해져 있다)
• 앞의 액션 게임 예제에는, standing, ducking, jumping, diving이다
• 항상 하나의 state에 있어야 함
• 동시에 jumping과 diving을 할 수 없다. State 중복을 막는 것이 FSM 사용 이유
• Input 또는 event를 FSM 에게 보낸다
• Input에 따라서 state가 변할 수 있다 (transitions)
FINITE STATE MACHINE 장단점
• 장점
• 제한된 상태를 적용함으로써 복잡한 코드를 간단하게 만든다
• 단점
• 하나의 상태로 모든 것을 관리하기 어렵다
• Concurrent state machines 등 활용
FINITE STATE MACHINE 구현
• 앞의 State와 비슷한데, 차이점은
• State 사이의 전환은 State 클래스 자체적으로 한다
• FSM에게 Input또는 Event를 입력하면 FSM이 State전환을 한다

More Related Content

What's hot

자바스크립트 패턴 3장
자바스크립트 패턴 3장자바스크립트 패턴 3장
자바스크립트 패턴 3장Software in Life
 
파이썬 프로퍼티 디스크립터 이해하기
파이썬 프로퍼티 디스크립터 이해하기파이썬 프로퍼티 디스크립터 이해하기
파이썬 프로퍼티 디스크립터 이해하기Yong Joon Moon
 
Web Components 101 polymer & brick
Web Components 101 polymer & brickWeb Components 101 polymer & brick
Web Components 101 polymer & brickyongwoo Jeon
 
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1성일 한
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초beom kyun choi
 
JavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsJavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsHyuncheol Jeon
 

What's hot (8)

자바스크립트 패턴 3장
자바스크립트 패턴 3장자바스크립트 패턴 3장
자바스크립트 패턴 3장
 
Hacosa j query 2th
Hacosa j query 2thHacosa j query 2th
Hacosa j query 2th
 
파이썬 프로퍼티 디스크립터 이해하기
파이썬 프로퍼티 디스크립터 이해하기파이썬 프로퍼티 디스크립터 이해하기
파이썬 프로퍼티 디스크립터 이해하기
 
Web Components 101 polymer & brick
Web Components 101 polymer & brickWeb Components 101 polymer & brick
Web Components 101 polymer & brick
 
Hacosa j query 4th
Hacosa j query 4thHacosa j query 4th
Hacosa j query 4th
 
처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1처음배우는 자바스크립트, 제이쿼리 #1
처음배우는 자바스크립트, 제이쿼리 #1
 
파이썬 언어 기초
파이썬 언어 기초파이썬 언어 기초
파이썬 언어 기초
 
JavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and ConstructorsJavaScript Patterns - Chapter 3. Literals and Constructors
JavaScript Patterns - Chapter 3. Literals and Constructors
 

Viewers also liked

창의적 발상 Typo 2
창의적 발상 Typo 2창의적 발상 Typo 2
창의적 발상 Typo 2은지 김
 
L 0 0172호
L 0 0172호L 0 0172호
L 0 0172호KwonSH
 
01 electrical fire_data research
01 electrical fire_data research01 electrical fire_data research
01 electrical fire_data researchjohgo1004
 
보안위협과 취약성V0.1
보안위협과 취약성V0.1보안위협과 취약성V0.1
보안위협과 취약성V0.1동우 김
 
Design pattern study 4 factory pattern _ by dragor0123
Design pattern study 4 factory pattern _ by dragor0123Design pattern study 4 factory pattern _ by dragor0123
Design pattern study 4 factory pattern _ by dragor0123dragor0123
 
TOC의 티핑포인트
TOC의 티핑포인트TOC의 티핑포인트
TOC의 티핑포인트Murian Song
 
전기안전2532조기완
전기안전2532조기완전기안전2532조기완
전기안전2532조기완기완 조
 
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3Daniel Lim
 
Electrical Fire Data Research
Electrical Fire Data ResearchElectrical Fire Data Research
Electrical Fire Data Researchjohgo1004
 
C:\Documents And Settings\Uxxxxxxx\바탕 화면\탐구모임(1차발표자료) 수정
C:\Documents And Settings\Uxxxxxxx\바탕 화면\탐구모임(1차발표자료) 수정C:\Documents And Settings\Uxxxxxxx\바탕 화면\탐구모임(1차발표자료) 수정
C:\Documents And Settings\Uxxxxxxx\바탕 화면\탐구모임(1차발표자료) 수정lovehi
 
Gamification (spicy marketing)
Gamification (spicy marketing)Gamification (spicy marketing)
Gamification (spicy marketing)Kwan Hang Cho
 
기획학과 A 11학번 김의환
기획학과 A 11학번 김의환기획학과 A 11학번 김의환
기획학과 A 11학번 김의환kyhss1805
 
게임 기획자 대체 뭐하는 놈들일까
게임 기획자 대체 뭐하는 놈들일까 게임 기획자 대체 뭐하는 놈들일까
게임 기획자 대체 뭐하는 놈들일까 상준 이
 
120629 fsm in unity3d skyseer
120629 fsm in unity3d skyseer120629 fsm in unity3d skyseer
120629 fsm in unity3d skyseerChan-hyun Park
 
2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인홍준 김
 
광운대[바람] 4.vhdl fsm
광운대[바람] 4.vhdl fsm광운대[바람] 4.vhdl fsm
광운대[바람] 4.vhdl fsmNAVER D2
 
Learn design pattern-1
Learn design pattern-1Learn design pattern-1
Learn design pattern-1Daniel Lim
 

Viewers also liked (20)

창의적 발상 Typo 2
창의적 발상 Typo 2창의적 발상 Typo 2
창의적 발상 Typo 2
 
L 0 0172호
L 0 0172호L 0 0172호
L 0 0172호
 
01 electrical fire_data research
01 electrical fire_data research01 electrical fire_data research
01 electrical fire_data research
 
보안위협과 취약성V0.1
보안위협과 취약성V0.1보안위협과 취약성V0.1
보안위협과 취약성V0.1
 
Design pattern study 4 factory pattern _ by dragor0123
Design pattern study 4 factory pattern _ by dragor0123Design pattern study 4 factory pattern _ by dragor0123
Design pattern study 4 factory pattern _ by dragor0123
 
TOC의 티핑포인트
TOC의 티핑포인트TOC의 티핑포인트
TOC의 티핑포인트
 
전기안전2532조기완
전기안전2532조기완전기안전2532조기완
전기안전2532조기완
 
Design Pattern 3
Design Pattern 3Design Pattern 3
Design Pattern 3
 
Electrical Fire Data Research
Electrical Fire Data ResearchElectrical Fire Data Research
Electrical Fire Data Research
 
C:\Documents And Settings\Uxxxxxxx\바탕 화면\탐구모임(1차발표자료) 수정
C:\Documents And Settings\Uxxxxxxx\바탕 화면\탐구모임(1차발표자료) 수정C:\Documents And Settings\Uxxxxxxx\바탕 화면\탐구모임(1차발표자료) 수정
C:\Documents And Settings\Uxxxxxxx\바탕 화면\탐구모임(1차발표자료) 수정
 
Gamification (spicy marketing)
Gamification (spicy marketing)Gamification (spicy marketing)
Gamification (spicy marketing)
 
기획학과 A 11학번 김의환
기획학과 A 11학번 김의환기획학과 A 11학번 김의환
기획학과 A 11학번 김의환
 
게임 기획자 대체 뭐하는 놈들일까
게임 기획자 대체 뭐하는 놈들일까 게임 기획자 대체 뭐하는 놈들일까
게임 기획자 대체 뭐하는 놈들일까
 
Cloud Design Pattern
Cloud Design PatternCloud Design Pattern
Cloud Design Pattern
 
Toc
TocToc
Toc
 
120629 fsm in unity3d skyseer
120629 fsm in unity3d skyseer120629 fsm in unity3d skyseer
120629 fsm in unity3d skyseer
 
Game ai.fsm.01
Game ai.fsm.01Game ai.fsm.01
Game ai.fsm.01
 
2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인2장 상태구도형 에이전트의 디자인
2장 상태구도형 에이전트의 디자인
 
광운대[바람] 4.vhdl fsm
광운대[바람] 4.vhdl fsm광운대[바람] 4.vhdl fsm
광운대[바람] 4.vhdl fsm
 
Learn design pattern-1
Learn design pattern-1Learn design pattern-1
Learn design pattern-1
 

Similar to Game Design patterns, Visitor, State, FSM pattern

Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Ji Ung Lee
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GDG Korea
 
Design patterns
Design patternsDesign patterns
Design patternsdf
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개beom kyun choi
 
[2011 04 11]mock_object 소개
[2011 04 11]mock_object 소개[2011 04 11]mock_object 소개
[2011 04 11]mock_object 소개Jong Pil Won
 
Node.js and react
Node.js and reactNode.js and react
Node.js and reactHyungKuIm
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅NAVER D2
 
Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)승욱 정
 
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Leonardo YongUk Kim
 
Jlook open api platform-appdevguide
Jlook open api platform-appdevguideJlook open api platform-appdevguide
Jlook open api platform-appdevguideHongSeong Jeon
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oopYoung-Beom Rhee
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍Young-Beom Rhee
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initializationEunjoo Im
 
시작하자 단위테스트
시작하자 단위테스트시작하자 단위테스트
시작하자 단위테스트YongEun Choi
 
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3suitzero
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdfHyosang Hong
 
[Swift] Properties
[Swift] Properties[Swift] Properties
[Swift] PropertiesBill Kim
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Sangon Lee
 

Similar to Game Design patterns, Visitor, State, FSM pattern (20)

Refactoring - Chapter 8.2
Refactoring - Chapter 8.2Refactoring - Chapter 8.2
Refactoring - Chapter 8.2
 
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
GKAC 2015 Apr. - Battery, 안드로이드를 위한 쉬운 웹 API 호출
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Dependency Injection 소개
Dependency Injection 소개Dependency Injection 소개
Dependency Injection 소개
 
[2011 04 11]mock_object 소개
[2011 04 11]mock_object 소개[2011 04 11]mock_object 소개
[2011 04 11]mock_object 소개
 
Node.js and react
Node.js and reactNode.js and react
Node.js and react
 
Tdd 4장
Tdd 4장Tdd 4장
Tdd 4장
 
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
 
Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)Swift3 : class and struct(+property+method)
Swift3 : class and struct(+property+method)
 
강의자료4
강의자료4강의자료4
강의자료4
 
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?Realm은 어떻게 효율적인 데이터베이스를 만들었나?
Realm은 어떻게 효율적인 데이터베이스를 만들었나?
 
Jlook open api platform-appdevguide
Jlook open api platform-appdevguideJlook open api platform-appdevguide
Jlook open api platform-appdevguide
 
프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop프론트엔드스터디 E05 js closure oop
프론트엔드스터디 E05 js closure oop
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
시작하자 단위테스트
시작하자 단위테스트시작하자 단위테스트
시작하자 단위테스트
 
HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3HolubOnPatterns/chapter3_3
HolubOnPatterns/chapter3_3
 
Javascript 교육자료 pdf
Javascript 교육자료 pdfJavascript 교육자료 pdf
Javascript 교육자료 pdf
 
[Swift] Properties
[Swift] Properties[Swift] Properties
[Swift] Properties
 
Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조Android 기초강좌 애플리캐이션 구조
Android 기초강좌 애플리캐이션 구조
 

Game Design patterns, Visitor, State, FSM pattern

  • 1. 디자인 패턴 스터디 VISITOR, STATE, FINITE STATE MACHINE
  • 3. VISITOR PATTERN 언제 쓰는가 • 의도: 클래스를 변경하지 않고 새로운 작업을 정의하는 방법 • 서로 다른 object 들이 모여 있는 배열, 트리, 또는 맵과 같은 집합이 있는데 • 각 object에 대해서 수행할 작업이 존재한다. • 하지만 각 object 내에서 해당 작업에 대한 코드를 넣고 싶지 않을때 • 그렇다고 각 object의 type을 식별해서 casting 하고 싶지 않을때 • VISITOR PATTERN이 구현된 코드를 통해서 살펴보겠습니다
  • 5. VISITOR PATTERN 구현 예제 • ELEMENT 추상 클래스 • 자연의 원소(element)들을 이용한 skill을 가지고 게임을 한다고 가정한다 • 원소는 Water, Fire, Air가 있다고 하자 • WATER, FIRE, AIR 클래스는 ELEMENT를 상속받음 • VISITOR 추상 클래스 • Water, Fire, Air에 대해서 visit() 함수를 구현할 수 있도록 virtual 함수 선언 • GET_SKILL_VISITOR 클래스 (VISITOR 상속) • 각 Element를 획득했을 때 실행될 함수들을 구현 • LOSE_SKILL_VISITOR 클래스 (VISITOR 상속) • 각 Element를 잃었을 때 실행될 함수들을 구현
  • 6. ELEMENT 추상 클래스 // ELEMENT 추상 클래스 class Element { public: virtual void Accept(Visitor& v) = 0; // 자식들이 Visitor를 받을 수 있도록 virtual void ToString() = 0; // 이건 그냥 화면에 보여주기 위함 };
  • 7. ELEMENT 구현 클래스들 class Water : public Element { public: void Accept(Visitor &v) { v.visit(this); } void ToString() { printf_s("Watern"); } }; class Fire : public Element { public: void Accept(Visitor& v) { v.visit(this); } void ToString() { printf_s("Firen"); } }; class Air : public Element { public: void Accept(Visitor& v) { v.visit(this); } void ToString() { printf_s("Airn"); } };
  • 8. VISITOR 추상 클래스 class Visitor { public: // 입력 받을 각 클래스에 따라서 함수 선언 virtual void visit(class Water* element) = 0; virtual void visit(class Fire* element) = 0; virtual void visit(class Air* element) = 0; };
  • 9. VISITOR 구현 클래스들 class GetSkill_Visitor : public Visitor { virtual void visit(Water* element) { printf_s("GetSkill "); element->ToString(); } virtual void visit(Fire* element) { printf_s("GetSkill "); element->ToString(); } virtual void visit(Air* element) { printf_s("GetSkill "); element->ToString(); } }; class LoseSkill_Visitor : public Visitor { virtual void visit(Water* element) { printf_s("LoseSkill "); element->ToString(); } virtual void visit(Fire* element) { printf_s("LoseSkill "); element->ToString(); } virtual void visit(Air* element) { printf_s("LoseSkill "); element->ToString(); } };
  • 10. MAIN 함수 Element *elementArr[] = { new Water(), new Air(), new Fire() // 각 클래스 생성, 배열에 넣기 }; GetSkill_Visitor getSkill; // VISITOR 생성 LoseSkill_Visitor loseSkill; // VISITOR 생성 for (int i = 0; i < 3; i++) elementArr[i]->Accept(getSkill); // GetSkill VISITOR를 배열의 각 원소에 실행 for (int i = 0; i < 3; i++) elementArr[i]->Accept(loseSkill); // LoseSkill VISITOR를 배열의 각 원소에 실행
  • 12. VISITOR PATTERN 장단점 • 단점: • 새로운 클래스를 추가할 때마다, VISITOR 클래스 마다 METHOD를 추가해야 한다 • 클래스 설계 전에 VISITOR 패턴의 사용을 염두에 두고 만들어야 한다 • 이미 만들어진 코드에 적용하면 복잡해질 수 있다 • 장점: • 클래스 마다 인터페이스가 다를 때, 각 클래스로부터 데이터 얻는 법을 캡슐화 할 수 있음 • 현재 코드가 없거나 코드를 변경할 수 없는 클래스에 대한 기능을 추가할 수 있다 • 서로 관련이 있는 작업들을 하나의 클래스로 묶을 수 있다 • 서로 관련이 없는 클래스들로부터 데이터를 모아서 처리할 수 있게 한다
  • 14. STATE PATTERN 언제 쓰는가 • 의도: state가 변하면 object의 동작이 변하도록. 마치 다른 클래스처럼 동작하도록 • 구현방법: • Wrapper 클래스를 만들어서 외부에는 단일 인터페이스를 노출시킨다 • State 추상 클래스 정의 • State 추상 클래스를 상속받아서 각 state를 정의 및 구현한다 • 현재 state에 대한 pointer를 context 클래스에서 유지한다 • State를 바꾸기 위해서는 state pointer를 바꾼다
  • 16. STATE PATTERN 구현 예제 • Player 클래스는 현재 state (super, normal)에 따라서 공격력과 방어력이 달라짐 • Player가 state를 가리키는 wrapper 클래스이며, • 각 state별로 attack와 defend 함수들이 다르게 작동하도록 만듬
  • 17. PLAYER 클래스 class Player { public: void SetCurrent(State* s) { m_Current = s; } void Attack() { m_Current->Attack(); } void Defend() { m_Current->Defend(); } private: class State* m_Current; };
  • 18. STATE 추상 클래스 class State { public: virtual void Attack() = 0; virtual void Defend() = 0; };
  • 19. STATE의 구현 클래스들 class SuperMode : public State { public: void Attack() { printf_s(“2x damage!!n"); } void Defend() { printf_s("Armor 2x!n"); } }; class NormalMode : public State { public: void Attack() { printf_s(“1x damage...n"); } void Defend() { printf_s("Armor none...n"); } };
  • 20. MAIN 함수 Player myPlayer; SuperMode superMode; myPlayer.SetCurrent(&superMode); // 슈퍼 모드르 state 세팅 myPlayer.Attack(); myPlayer.Defend(); NormalMode normalMode; myPlayer.SetCurrent(&normalMode); // 보통 모드로 state 변경 myPlayer.Attack(); myPlayer.Defend();
  • 23. FSM이 왜 필요? • 액션 게임을 만들었다고 하자 • 플레이는 방향 키를 밑으로 누르면 앉을 수도 있고 (duck), • B를 누르면 띌 수도 있다고 하자. • 그리고 띄는 중에 방향 키를 밑으로 누 르면 다이빙한다고 하자 • 이를 그림으로 나타내면 좌측과 같다
  • 24. FINITE STATE MACHINE 개념 • Fixed set of states • Machine이 가질 수 있는 상태의 집합은 유한하다 (즉, 가능한 상태들이 정해져 있다) • 앞의 액션 게임 예제에는, standing, ducking, jumping, diving이다 • 항상 하나의 state에 있어야 함 • 동시에 jumping과 diving을 할 수 없다. State 중복을 막는 것이 FSM 사용 이유 • Input 또는 event를 FSM 에게 보낸다 • Input에 따라서 state가 변할 수 있다 (transitions)
  • 25. FINITE STATE MACHINE 장단점 • 장점 • 제한된 상태를 적용함으로써 복잡한 코드를 간단하게 만든다 • 단점 • 하나의 상태로 모든 것을 관리하기 어렵다 • Concurrent state machines 등 활용
  • 26. FINITE STATE MACHINE 구현 • 앞의 State와 비슷한데, 차이점은 • State 사이의 전환은 State 클래스 자체적으로 한다 • FSM에게 Input또는 Event를 입력하면 FSM이 State전환을 한다