{{위키데이터 속성 추적}}
'''상태 패턴'''(state pattern)은 [[객체 지향]] 방식으로 [[상태 기계]]를 구현하는 [[행위 배턴|행위]] [[소프트웨어 디자인 패턴]]이다. 상태 패턴을 이용하면 상태 패턴 인터페이스의 파생 클래스로서 각각의 상태를 구현함으로써, 또 패턴의 슈퍼클래스에 의해 정의되는 [[메소드 (컴퓨터 프로그래밍)|메소드]]를 호출하여 상태 변화를 구현함으로써 상태 기계를 구현한다.

상태 패턴은 패턴의 인터페이스에 정의된 메소드들의 호출을 통해 현재의 전략을 전환할 수 있는 [[전략 패턴]]으로 해석할 수 있다.

== 개요 ==
상태<ref name="GOF">{{서적 인용|author1=Erich Gamma|author2=Richard Helm|author3=Ralph Johnson|author4=John Vlissides|title=Design Patterns: Elements of Reusable Object-Oriented Software|year=1994|publisher=Addison Wesley|isbn=0-201-63361-2|pages=305ff}}</ref> 디자인 패턴은 유연하고 재사용 가능한 객체 지향 소프트웨어를 설계하기 위해 반복되는 디자인 문제를 해결하는 방법, 즉 객체는 구현, 변경, 테스트, 재사용이 쉬워야 한다는 것을 기술하는, 잘 알려진 23가지 [[디자인 패턴 (책)|GoF 디자인 패턴]]들 중 하나이다.

== 구조 ==
=== UML 클래스 및 시퀀스 다이어그램 ===
[[파일:w3sDesign State Design Pattern UML.jpg|frame|none|상태 디자인 패턴을 위한 샘플 UML 클래스와 시퀀스 다이어그램.<ref>{{웹 인용|title=The State design pattern - Structure and Collaboration|url=http://w3sdesign.com/?gr=b08&ugr=struct|website=w3sDesign.com|accessdate=2017-08-12}}</ref>]]

=== 클래스 다이어그램 ===
[[파일:State Design Pattern UML Class Diagram.svg|섬네일|none|451x451px|[[통합 모델링 언어|UML]]의 상태<ref name="GOF" /><ref name="lepus3" /> ]]
[[파일:State pattern in LePUS3.gif|섬네일|none|400px|[[LePUS3]]이ㅡ 상태<ref name="lepus3">{{웹 인용 |url=http://www.lepus.org.uk/ref/companion/State.xml# |제목=State pattern in UML and in LePUS3 |확인날짜=2018-03-06 |보존url=https://web.archive.org/web/20160805230005/http://www.lepus.org.uk/ref/companion/State.xml# |보존날짜=2016-08-05 |url-status=dead }}</ref><ref>{{웹 인용 |url=http://lepus.org.uk/ref/legend/legend.xml# |제목=legend |확인날짜=2018-03-06 |보존url=https://web.archive.org/web/20180314162121/http://www.lepus.org.uk/ref/legend/legend.xml# |보존날짜=2018-03-14 |url-status=dead }}</ref> ]]

== 예 ==
=== 자바 ===
<syntaxhighlight lang=Java>
interface Statelike {
    void writeName(StateContext context, String name);
}

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

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());
        }
    }
}
</syntaxhighlight>

<syntaxhighlight lang=Java>
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);
    }
}
</syntaxhighlight>

아래는 사용법이다:

<syntaxhighlight lang=Java>
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");
    }
}
</syntaxhighlight>

위의 코드와 함께 <code lang=Java>DemoOfClientState</code>의 <code lang=Java>main()</code>의 출력은 다음과 같다:

 monday
 TUESDAY
 WEDNESDAY
 thursday
 FRIDAY
 SATURDAY
 sunday

== 각주 ==
{{각주}}

== 외부 링크 ==
* [http://sourcemaking.com/design_patterns/state State Design Pattern]

{{디자인 패턴(소프트웨어)}}

[[분류:소프트웨어 디자인 패턴]]