본문 바로가기
개발/디자인 패턴

[Java 언어로 배우는 디자인 패턴 입문] 상태를 관리하기 19. State

by hongdor 2021. 1. 17.
728x90

출처 : 책 - java 언어로 배우는 디자인 패턴 입문

 

19. State - 상태를 클래스로 표현하기

 

 

1. 목적

 

 - 규모가 크면 작은 클래스로 쪼개서 관리하는 것이 좋다.

 - Context 내부 State 인터페이스의 메소드가 실행된 후에 Context의 State를 다른 State 구현 클래스로 바꿔준다.  

 - 상태1에 내부에서 상태2로 전환시키기 때문에 상태 클래스들 사이에 의존성이 있다.

 - 새로운 상태 클래스를 추가하는 것은 간단하다. 하지만 상태전환 로직은 상태 클래스들의 메소드의 수정이 필요하다. 

 

 

2. 예제

 

책보다 위키백과의 예제가 더 좋은 것 같기에 가져왔다.

상태 패턴 - 위키백과, 우리 모두의 백과사전 (wikipedia.org)

 

상태 패턴 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기

ko.wikipedia.org

 

(1) Statelike - State 인터페이스

interface Statelike {
    void writeName(StateContext context, String name);
}

 

 

(2) StateLowerCase - State 구현 1 : context.setState 가 핵심

class StateLowerCase implements Statelike {
    @Override
    public void writeName(final StateContext context, final String name) {
        System.out.println(name.toLowerCase());
        context.setState(new StateMultipleUpperCase());
    }
}

 

 

(3) StateMultipleUpperCase - State 구현 2 : context.setState 가 핵심

class StateMultipleUpperCase implements Statelike {
    /** Counter local to this state */
    private int count = 0;

    @Override
    public void writeName(final StateContext context, final String name) {
        System.out.println(name.toUpperCase());
        /* Change state after StateMultipleUpperCase's writeName() gets invoked twice */
        if(++count > 1) {
            context.setState(new StateLowerCase());
        }
    }
}

 

 

(4) StateContext - 문맥 현재 State를 가지고 있다.

class StateContext {
    private Statelike myState;
    StateContext() {
        setState(new StateLowerCase());
    }

    /**
     * Setter method for the state.
     * Normally only called by classes implementing the State interface.
     * @param newState the new state of this context
     */
    void setState(final Statelike newState) {
        myState = newState;
    }

    public void writeName(final String name) {
        myState.writeName(this, name);
    }
}

 

 

(5) DemoOfClientState - Client

public class DemoOfClientState {
    public static void main(String[] args) {
        final StateContext sc = new StateContext();

        sc.writeName("Monday");
        sc.writeName("Tuesday");
        sc.writeName("Wednesday");
        sc.writeName("Thursday");
        sc.writeName("Friday");
        sc.writeName("Saturday");
        sc.writeName("Sunday");
    }
}

 

 

(6) 출력 결과

monday
TUESDAY
WEDNESDAY
thursday
FRIDAY
SATURDAY
sunday
728x90

댓글