본문 바로가기
Theory/Design Pattern

State Pattern

by y.j 2022. 5. 21.
728x90

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

728x90

'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

댓글