상태 디자인패턴
- 객체의 내부 상태에 따라 스스로 행동을 변경할 수 있게 허가하는 패턴.
클래스 설명
어떤 연산에 그 객체의 상태에 따라 달라지는 다중 분기 조건 처리가 너무 많이 들어 있을 때, 객체의 상태를 표현하기 위해 상태를 하나 이상의 나열형 상수로 정의해야 한다. 동일한 조건 문장들을 하나 이상의 연산에 중복 정의해야 하는 때가 있다. 이때 객체의 상태를 별도의 객체로 정의하면, 다른 객체들과 상관없이 그 객체의 상태를 다양화시킬 수 있다. 상태는 다르나 동일한 요청을 받을 때 사용하는 패턴이라고 기억하면 되겠다.
클래스 사용방법
var marine: Marine = new Marine();
marine.stimpack(); //스팀팩사용 10후 기본상태로 전환.
클래스 구성
//State 인터페이스
package
{
public interface State
{
function move(): void;
function attack(): void;
function stimpack(): void;
}
}
//ConcreteState 서브클래스 : 상태클래스
//기본상태
package
{
public class NormalState implements State
{
public function NormalState()
{
}
public static function getInstance(): NormalState
{
}
public function move( m: Marine): void
{
}
public function attack( m: Marine): void
{
}
public function stimpack( m: Marine ): void
{
//기능없음.
}
}
//스팀팩상태
public class StimPackState implements State
{
public function StimPackState()
{
}
public static function getInstance(): StimPackState
{
}
public function move( m: Marine): void
{
}
public function attack( m: Marine): void
{
}
public function stimpack( m: Marine ): void
{
//내부구현 생략...
//10초 후에 changeState호출
m.changeState( NormalState.getInstance() );
}
}
}
//Context( Marine) 클래스 : 상태관리 클래스
package
{
public class Marine
{
private var _state: State;
public function Marine()
{
_state = NormalState.getInstance(); //상태 초기설정
}
public function changeState(s: State): void
{
_state = s;
}
public funciton move(): void
{
_state.move( this );
}
public function attack(): void
{
_state.attack( this );
}
public function stimpack(): void
{
changeState( StimPackState.getInstance() ); //스팀팩상태 설정
_state.stimpack( this );
}
}
}
※ State 인터페이스를 구현상속하는 상태객체 서브클래스를 생성할 때 AbstractState 추상클래스를 구현해주고 서브클래스들이 추상클래스를 상속받게 하므로써 인터페이스를 상속받은 서브클래스들의 구현의무를 벗어나게 해준다. 이는 대규모 프로젝트에서 객체를 많이 생성할 때 그 진가를 발휘하게 될 것이다.
//상태 추상클래스
//모든 서브클래스( NormalState, StimPackState ... )들은 AbstractState 클래스를 상속받으며, 해당되는 기능만 오버라이드해서 기능을 구현하면 되겠다.
package
{
public class AbstractState implements State
{
public function AbstractState()
{
}
public static function getInstance(): NormalState
{
}
public function move( m: Marine): void
{
}
public function attack( m: Marine): void
{
}
public function stimpack( m: Marine ): void
{
}
}
}
'디자인 패턴' 카테고리의 다른 글
디자인패턴 : Composite (0) | 2011.08.03 |
---|---|
디자인패턴 : Iterator (0) | 2011.08.03 |
디자인패턴 : Template Method (0) | 2011.08.03 |
디자인패턴 : Facade (0) | 2011.08.03 |
디자인패턴 : Factory Method (0) | 2011.08.03 |