프로그래밍 기술/Escort GoF의 디자인 패턴

23. 상태 패턴(State Pattern) [Escort GoF의 디자인 패턴]

언제나휴일 2016. 4. 4. 15:15
반응형

23. 상태 패턴(State Pattern)

 

23.1 개요

 

 프로그래밍하다 보면 개체의 상태에 따라 구체적인 행위가 다르게 작성해야 하는 경우가 있습니다. 상태 패턴은 이와 같이 상태에 따라 동작을 다르게 해야 하는 부분만 별도의 클래스로 정의를 하는 패턴입니다.

 

 상태 패턴에서는 특정 형식의 개체가 상태에 따라 동작을 다르게 하는 행위를 조사하여 추상 클래스로 만듭니다. 그리고 각 상태에 따라 구체적인 행동을 하는 파생 클래스들을 정의하게 됩니다. 이와 같이 정의하면 특정 형식에서 해당 부분은 별도의 상태 개체를 통해 수행하게 됩니다. 상태 패턴을 이용하면 개발자는 본다면 특정 형식의 상태의 추가나 삭제에 빠르고 유연하게 대처할 수 있게 됩니다.

 

23. 2 시나리오

 

 이번에 EH Camera 업체에서는 단순화 된 UI를 갖는 카메라를 기획하고 있습니다. 이전의 카메라는 셔터 스피드를 조절하는 다이얼은 앞쪽에 있고 조리개의 F값을 조절하는 다이얼은 뒤쪽에 있었는데 많은 사용자들이 앞쪽에 있는 다이얼을 사용하지 않는 것으로 조사되었습니다. 이번에 제작할 카메라에는 다이얼을 하나만 만들겠다고 합니다기본적으로 다이얼로 조리개의 F값을 조절을 하게 만들고 셔터 뒤에 있는 정보 보기 버튼을 누른 상태에서는 다이얼로 셔터 스피드를 조절하게 한다고 합니다. 저도 생각해 보니 앞쪽 다이얼은 자주 사용하지 않는 것 같아요. 새로운 카메라가 나오기 전에 셔터 스피드를 조절하여 사진을 찍었을 때 어떠한 변화가 있는지 체험해 봐야겠어요.

 

 이번 주에는 천안 운동장에 가서 혁재의 뛰노는 모습을 담아볼래요


상태 패턴


AboutState.zip

//common.h

#pragma once

 

#pragma warning (disable:4996)

#include <iostream>

 

using std::cout;

using std::endl;

#include <vector>

using std::vector;

#include <string>

using std::string;

 

#include <iomanip>

using std::ios;

#include <algorithm>

 

#pragma warning(disable:4482)

 

//Iris.h

#pragma once

 

class Iris

{

             int focal_length;

public:

             Iris()

             {

                           focal_length = 2;

             }

             int Up()

             {

                           if(focal_length<10)

                           {

                                        focal_length++;                  

                           }

                           return focal_length;

             }

             int Down()

             {

                           if(focal_length>2)

                           {

                                        focal_length--;

                           }

                           return focal_length;

             }

            

};

 

//Shutter.h

#pragma once

 

class Shutter

{

             int speed;

public:

             Shutter()

             {

                           speed = 0;

             }

             int Up()

             {

                           speed++;             

                           return speed;

             }

             int Down()

             {

                           if(speed>0)

                           {

                                        speed--;

                           }

                           return speed;

             }

            

};

 

//State.h

#pragma once

 

class State

{

public:

             virtual void Up()=0;

             virtual void Down()=0;

};

 

//OnState.h

#pragma once

#include "State.h"

#include "Shutter.h"

class OnState :

             public State

{

             Shutter *shutter;

public:

             OnState(Shutter *shutter)

             {

                           this->shutter = shutter;

             }

             virtual void Up()

             {                         

                           cout<<"셔터 스피드 올라감. 현재 스피드 :"<<shutter->Up()<<endl;

             }

             virtual void Down()

             {           

                           cout<<"셔터 스피드 내려감. 현재 스피드 :"<<shutter->Down()<<endl;

             }

};

 

//OffState.h

#pragma once

 

#include "State.h"

#include "Iris.h"

#include "common.h"

class OffState :

             public State

{

             Iris *iris;

public:

             OffState(Iris *iris)

             {

                           this->iris = iris;

             }

             virtual void Up()

             {                         

                           cout<<"F 증가되었음. 현재 F:"<<iris->Up()<<endl;

             }

             virtual void Down()

             {           

                           cout<<"F 감소되었음. 현재 F:"<<iris->Down()<<endl;

             }

};

 

//Camera.h

#pragma once

#include "OffState.h"

#include "OnState.h"

#include "Iris.h"

#include "Shutter.h"

class Camera

{

             State *states[2];

             Iris *iris;

             Shutter *shutter;

             int statenum;

public:

             Camera(void);

             ~Camera(void);

             void ToggleInfoButton();

             void DialUp();

             void DialDown();

};

 

//Camera.cpp

#include "Camera.h"

 

Camera::Camera(void)

{

             iris = new Iris();

             shutter = new Shutter();

             states[0] = new OffState(iris);

             states[1] = new OnState(shutter);

             statenum = 0;

}

 

Camera::~Camera(void)

{

             delete states[0];

             delete states[1];

             delete iris;

             delete shutter;

}

void Camera::ToggleInfoButton()

{

             statenum = (statenum+1)%2;

}

void Camera::DialUp()

{

             states[statenum]->Up();

}

void Camera::DialDown()

{

             states[statenum]->Down();

}

 

//Demo.cpp

#include "Camera.h"

int main()

{

             Camera *camera = new Camera();

             camera->DialUp();

             camera->DialDown();

 

             camera->ToggleInfoButton();

             camera->DialUp();

             camera->DialDown();

 

             delete camera;

             return 0;

}

 

IT 전문가로 가는 길 Escort GoF의 디자인 패턴
국내도서
저자 : 장문석
출판 : 언제나휴일 2013.04.01
상세보기


반응형