State Pattern
internal state가 변경되었을 때 행위를 교체하는 것을 허용한다.
internal state가 변경되었을 때 행동을 어떻게 교체할까?
어떻게 state기반 행동을 명시하고나서 새로운 state가 추가하거나
이미 존재하는 state의 행동을 독립적으로 변경할까?
주문 시스템에서 주문 Object가 있다고 하자. 이 주문을 취소하는 상태가 있을수도 있고, 취소했다가 재구매하는 상태 등 여러가지 상태가 존재 할 수 있다. State Pattern은 주문 or 상품에 대해서 독립적으로 state를 만들어 새로운 state가 필요하거나 operation을 독립적으로 교환 할 수 있도록 해준다.
Solution
Context와 State를 분리하고, State를 상속받아 State1,2를 정의한다.
Context는 State를 set할 수 있어 독립적으로 State를 교환할 수 있다.
public class Context {
private State state;
public Context(State state) {
this.state = state;
}
public String operation() {
return "Context : Delegating state-specific behavior to the current State object.\n" +
state.operation(this);
}
void setState(State state) {
this.state = state;
}
}
State를 implements를 통해 여러가지 State를 만들 수 있다.
public class State1 implements State {
private static final State1 INSTANCE = new State1();
private State1() {}
public static State1 getInstance() {
return INSTANCE;
}
@Override
public String operation(Context context) {
String result = " State1 : Hello World1!" +
" Changing current state of Context to State2.";
context.setState(State2.getInstance());
return result;
}
}
위 예제코드에서는 State를 set내부로 넣었지만 바깥으로 뺄수도 있을 것이다.
Advantages
• 새로운 state를 추가하기 쉽다.
• state를 바꾸기 위한 조건문을 존재하지 않는다.
- state object를 교환하기만 하면 된다.
• 일관된 state를 보증한다.
- State object를 대체하더라도 internal state는 일관된다.
• state 이동이 명확하다.
Disadvantages
• Context interface를 확장하는 것이 필요할 수 있다.
- state object를 받을 수 있도록 interface를 확장해야하만 한다.
• 추가적인 level이 필요하다
[전체코드]
https://github.com/jKyounju/adapterPatterns/tree/master/src/BehavioralPattern/StatePattern
https://github.com/jKyounju/adapterPatterns/tree/master/test/BehavioralPattern
'Theory > Design Pattern' 카테고리의 다른 글
Template Method Pattern (0) | 2022.05.22 |
---|---|
Strategy Pattern (0) | 2022.05.22 |
Observer Pattern (0) | 2022.05.21 |
Memento Pattern (0) | 2022.05.21 |
Mediator Pattern (0) | 2022.05.15 |
댓글