728x90
출처 : 책 - java 언어로 배우는 디자인 패턴 입문
19. State - 상태를 클래스로 표현하기
1. 목적
- 규모가 크면 작은 클래스로 쪼개서 관리하는 것이 좋다.
- Context 내부 State 인터페이스의 메소드가 실행된 후에 Context의 State를 다른 State 구현 클래스로 바꿔준다.
- 상태1에 내부에서 상태2로 전환시키기 때문에 상태 클래스들 사이에 의존성이 있다.
- 새로운 상태 클래스를 추가하는 것은 간단하다. 하지만 상태전환 로직은 상태 클래스들의 메소드의 수정이 필요하다.
2. 예제
책보다 위키백과의 예제가 더 좋은 것 같기에 가져왔다.
상태 패턴 - 위키백과, 우리 모두의 백과사전 (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
'개발 > 디자인 패턴' 카테고리의 다른 글
[Java 언어로 배우는 디자인 패턴 입문] 낭비 없애기 21. Proxy (0) | 2021.01.17 |
---|---|
[Java 언어로 배우는 디자인 패턴 입문] 낭비 없애기 20. Flyweight (0) | 2021.01.17 |
[Java 언어로 배우는 디자인 패턴 입문] 상태를 관리하기 18. Memento (0) | 2021.01.15 |
[Java 언어로 배우는 디자인 패턴 입문] 상태를 관리하기 17. Observer (0) | 2021.01.14 |
[Java 언어로 배우는 디자인 패턴 입문] 단순화하기 16. Mediator (0) | 2021.01.13 |
댓글