state
업데이트:
스테이트 패턴
- 객체가 어떤일을 수행할때 어떤 상태인지 검사를 한 후 그에 맞는 행동을 수행하도록 한다.
- 하나하나 어떤 상태인지 검사해 일을 다르게 수행한다는 것은 복잡한 코드르 산출 하는것이다.
- 스테이트 패턴은 어떤 행위를 수행할때 상태를 객체로 만들어 수행하도록 위임한다.
패턴 수행 작업
State
- 시스템의모든 상태에 공통의 인터페이스를 제공한다. 따라서 이 인터페이스를 실체화한 어떤 상태 클래스도 기존 상태 클래스를 대신해 교체해서 사용할 수 있다.
- Context에서 변수로 선언되어 있으며 상태 구현체가 주입되어 구현체에게 위임하여 행동이 실행되도록 한다.
State1, State2, State3
- Context 객체가 요청한 작업을 자신의 방식으로 실제 실행한다.
- 대부분의 경우 다음 상태를 결정해 상태 변경을 Context 객체에 요청하는 역활도 수행한다.
- 상태에 따라 행동을 구현한 state의 구현체 이다.
- 위임 받은 상태에서 자신의 행동을 하면 되고, 특정 행동이 상태를 변경해야 할 때는 Context 객체의 state 변수에 다른 상태를 주입한다.
- 메소드에 Context가 매개변수로 넘어오기 때문에 상태 변경이 가능하다.
Context
- State를 이용하는 역할을 수행한다.
- 현재 시스템의 상태를 나타내는 상태 변수와 실제 시스템의 상태를 구성하는 여러 가지 변수가 있다.
- 각 상태 클래스에서 상태 변경을 요청해 상태를 바꿀 수 있도록 하는 메서드가 제공 된다.
- Context 요소를 구현한 클래스의 request 메서드는 실제 행위를 실행하는 대신 해당 상태 객체에 행위 실행을 위임한다.
- 사용 방식
- 변수로 State를 선언하고 처음 초기화시 기본 구현체가 위임된다.
- request 요청이 오면 생성자에서 위임된 실체화 객체의 행동이 실행된다.
- 상태가 변경되야 되는 요청이 와도 State.method(this) 를 통해 자신을 매개변수로 넘기기 대문에 구현체에서 Context.setState(new State1()) 방식으로 상태 변경도 가능하다.
- 상태 스스로 알아서 다음 상태를 결정한다고 볼 수 있다.
- 상태를 변경하는 클래스를 만들어서 이용할수도 있다.
- State.method(this) 방식으로 위임한 객체의 행동을 실행하기 때문에 코드의 변화 없이 확장이 가능하다.
스테이트 패턴은 상태에 따라 동일한 작업이 다른 방식으로 실행될 때 해당 상태가 작업을 수행하도록 위임하는 디자인 패턴이다.
전략(Strategy)패턴과 상태(State)패턴
공통점
- 인터페이스를 사용함으로써 Concrete Class를 캡술화 한다.
- 어떤 클래스가 할당되었는지는 무관하게 인터페이스만을 인자로 받아 실행하기 때문에 Context에는 영향을 받지 않고 유연한 변화가 가능하다.
차이점
- 전략 패턴은 한 번 인스턴스를 생성하면 상태가 거의 바뀌지 않을때 사용한다.
- 상태 패턴은 한번 인스턴스를 생성하고 난뒤 상태과 빈번하게 바뀔때(if, else의 분기점이 많을때) 사용한다.
- 전략 패턴은 외부에서 구현체를 주입하고 상태 패턴은 상태에서 다음 상태의 구현체를 주입한다.
댓글남기기