"상태 패턴"의 두 판 사이의 차이

 
(사용자 2명의 중간 판 13개는 보이지 않습니다)
3번째 줄: 3번째 줄:
;스테이트 패턴, 상태 패턴
;스테이트 패턴, 상태 패턴
* 상태를 클래스로 표현하는 구조
* 상태를 클래스로 표현하는 구조
* 상태 기계를 구현하는 [[행위 디자인 패턴]]
* 객체의 상태를 표현하기 위해서 이용되는 디자인 패턴
* 객체의 상태를 표현하기 위해서 이용되는 디자인 패턴
* 객체의 상황에 따라 동작을 규정하는 패턴으로서, 내부 상태에 따라 다른 방식으로 동작할 수 있게 한다.
* 상태 패턴 인터페이스의 파생 클래스로 각각의 상태를 구현하고, 패턴의 슈퍼클래스에 의해 정의되는 메소드를 호출하여 상태 변화를 구현함으로써 상태 기계를 구현한다.
* 인터페이스에 정의된 메소드들의 호출을 통해 현재의 전략을 전환할 수 있는, [[전략 패턴]]의 일종으로 볼 수도 있다. 둘다 [[위임 (OOP)|위임]]하는 [[객체 컴포지션]]이라는 공통점이 있다.


[[File:State Design Pattern UML Class Diagram.svg]]
[[File:State Design Pattern UML Class Diagram.svg]]
[[File:W3sDesign_State_Design_Pattern_UML.jpg]]


==예제==
==예제==
<source lang='java'>
<syntaxhighlight lang='java'>
interface State {  
interface State {  
         void writeName(StateContext stateContext, String name);
         void writeName(StateContext stateContext, String name);
30번째 줄: 36번째 줄:
         }
         }
}
}
</source>
</syntaxhighlight>
<source lang='java'>
<syntaxhighlight lang='java'>
public class StateContext {
public class StateContext {
         private State myState;  
         private State myState;  
46번째 줄: 52번째 줄:
         }  
         }  
}
}
</source>
</syntaxhighlight>
<source lang='java'>
<syntaxhighlight lang='java'>
public class TestClientState {  
public class TestClientState {  
         public static void main(String[] args) {  
         public static void main(String[] args) {  
65번째 줄: 71번째 줄:
// SATURDAY
// SATURDAY
// SUNDAY
// SUNDAY
</source>
</syntaxhighlight>


==같이 보기==
==같이 보기==
*[[Singleton 패턴]]
{{z컬럼3|
*[[Flyweight 패턴]]
* [[상태 기계]]
*[[디자인 패턴]]
* [[전략 패턴]]
* [[디자인 패턴]]
* [[싱글턴 패턴]]
* [[Flyweight 패턴]]
* [[템플릿 메소드 패턴]]
}}


==참고==
==참고==
*http://en.wikipedia.org/wiki/State_pattern
* {{영어위키백과|State pattern}}
* {{위키백과}}


[[분류: 디자인 패턴]]
[[분류: 디자인 패턴]]

2022년 4월 24일 (일) 20:59 기준 최신판

1 개요[ | ]

state pattern
스테이트 패턴, 상태 패턴
  • 상태를 클래스로 표현하는 구조
  • 상태 기계를 구현하는 행위 디자인 패턴
  • 객체의 상태를 표현하기 위해서 이용되는 디자인 패턴
  • 객체의 상황에 따라 동작을 규정하는 패턴으로서, 내부 상태에 따라 다른 방식으로 동작할 수 있게 한다.
  • 상태 패턴 인터페이스의 파생 클래스로 각각의 상태를 구현하고, 패턴의 슈퍼클래스에 의해 정의되는 메소드를 호출하여 상태 변화를 구현함으로써 상태 기계를 구현한다.
  • 인터페이스에 정의된 메소드들의 호출을 통해 현재의 전략을 전환할 수 있는, 전략 패턴의 일종으로 볼 수도 있다. 둘다 위임하는 객체 컴포지션이라는 공통점이 있다.

State Design Pattern UML Class Diagram.svg

W3sDesign State Design Pattern UML.jpg

2 예제[ | ]

interface State { 
        void writeName(StateContext stateContext, String name);
} 
 
class StateA implements State { 
        public void writeName(StateContext stateContext, String name) { 
                System.out.println(name.toLowerCase()); 
                stateContext.setState(new StateB()); 
        } 
} 
 
class StateB implements State { 
        private int count=0; 
        public void writeName(StateContext stateContext, String name){ 
                System.out.println(name.toUpperCase()); 
                // StateBのwriteName()が2度呼び出された後に状態を変化させる
                if(++count>1) { 
                        stateContext.setState(new StateA()); 
                }
        }
}
public class StateContext {
        private State myState; 
        public StateContext() { 
                setState(new StateA()); 
        } 
 
        public void setState(State newState) { 
                this.myState = newState; 
        }
 
        public void writeName(String name) { 
                this.myState.writeName(this, name); 
        } 
}
public class TestClientState { 
        public static void main(String[] args) { 
                StateContext sc = new StateContext(); 
                sc.writeName("Monday"); 
                sc.writeName("Tuesday"); 
                sc.writeName("Wednesday"); 
                sc.writeName("Thursday"); 
                sc.writeName("Saturday"); 
                sc.writeName("Sunday"); 
        }
}
// monday
// TUESDAY
// WEDNESDAY
// thursday
// SATURDAY
// SUNDAY

3 같이 보기[ | ]

4 참고[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}