본문 바로가기
SW 공부/Design Patterns

[디자인패턴] State pattern (상태 패턴)

by 꼬냉상 2022. 8. 28.

Purpose of State Pattern (상태 패턴의 목적)

- Ties object circumstances to its behavior, allowing the object to behave in different ways based upon its internal state.

- 내부 상태에 따라 다르게 동작할 수 있도록!

 

Design Principle (디자인원칙)

- OCP  :  Open-Closed Principle 

 

State pattern (상태 패턴)

- Define a State interface that contains a method for every action.
- Get rid of all of our conditional code and instead delegate to the state object to do the work for us.

- 모든 작업에 대한 메서드가 포함된 상태 인터페이스 정의 
- 모든 조건부 코드를 제거하고 대신 상태 객체에 위임하여 작업을 수행

 

→ The State Pattern allows an object to alter its behavior when its internal state changes. The object will appear to change its class.

 

Related Patterns

- State vs Strategy : composition with delegation을 쓰는 건 동일함!

  State

  → Encapsulates a state-dependent behavior and delegate behavior to the current states
  → 상태 패턴은 state object를 encapsulate 하고, 동작을 위임한다면

 Strategy

  → Encapsulate interchangeable behaviors and use delegation to decide which behavior to use

  → 전략 패턴은 algorithm을 encapsulate 하는 것으로 

〓▶ class diagram에는 큰 차이가 없지만, 의도가 문제 해결 목적이 다름!

 

Quiz)  은행계좌(BankAccount)에는 다음과 같은 세 가지의 상태(NoTransactionFeeState / TransctionFeeState / OverdrawnState)가 있고, 입금 (deposit) 혹은 출금(withdraw)에 따라 상태의 전환이 된다. 

 해당 문제를 State 패턴을 이용하여 설계하고 BankAccount 클래스의 핵심적인 코드 골격을 제시하시오. (Object Composition과 Delegation 반드시 표시)

public BankAccount {
    State currState;
    public performDepoxit(int amount) {
        currState.deposit(amount);
    }
    public performWithdraw(int amount) {
        currState.withdraw(amount);
    }
}

 

QUIZ) 다음 각 문장이 옳은지 O/X 로 답하시오

(X) 상태 패턴(State Pattern)을 적용할 때 구체(Concrete) 상태클래스는 context 개체에 대한 참고(reference)를 가져서는 안된다
→Create all ConcreteState objects once and have the Context Object keep references to them.

(X) 상태 패턴(State Pattern)은 객체합성 (Object Composition)과 위임 (Delegation)을 통해 동작한다.

 

본 글은 개인의 S/W 구조설계 역량 강화를 위한 학습 목적으로 정리된 내용입니다.
일부 타/개인 단체에 저작권이 있는 자료를 포함하고 있으므로, 절대 영리 목적으로 사용하실 수 없습니다.

 

반응형

댓글