[디자인패턴] State 패턴
State 패턴
'상태'를 클래스로 표현한 패턴이다.
클래스를 교체함으로써 '상태의 변화'를 나타내고, 따라서 새로운 상태를 추가해야할 때 어떻게 추가하면 되는 지가 명확해진다.
예제 프로그램) 경비 시스템
State패턴을 사용하지 않는 패턴과 State패턴의 수도코드를 보여주는데,
내가 평소에 전자로 짜는 편이라 많이 찔린다..


연습문제
19-1) Context를 인터페이스가 아닌 추상 클래스로 표현하고 state 필드를 Context 클래스로 표현하는 편이 패턴의 취지에 맞을텐데, 예제 프로그램에서는 Context의 역할을 Context 인터페이스로 구현하고 state 필드는 SafeFrame 클래스에서 표현하고 있습니다. 그 이유는 무엇입니까?
자바는 다중상속이 불가능하다.
만약 Context 역할을 클래스로 표현한다면, Frame클래스의 하위클래스인 SafeFrame클래스는 Context를 또 상속받을 수 없다.
+ Context 클래스의 하위 클래스를 따로 만들어 두고, 그 인스터스를 SafeFrame의 필드로 저장시켜 그 인스턴스에게 처리를 위임시킬 수는 있다.
19-2) 예제 프로그램에서 주간과 야간의 시간 범위를 변경하려고 합시다. 소스 프로그램 중 어디를 수정해야합니까?
DayState 클래스와 NightState 클래스의 doClock 메소드를 수정.
+ SafeFrame 클래스에 현재 주간인 지 야간인지를 조사하는 수단을 준비해두면, 두 클래스를 수정할 필요 없이 간편하게 시간변경 가능
19-3) 예제 프로그램에 '점심시간'(12:00 ~ 12:59) 를 추가해주십시오.
점심시간이라는 상태를 나타내는 NoonState 클래스를 작성하고, DayState 클래스와 NightState 클래스의 doClock 메소드를 수정한다.
19-4) 예제 프로그램에 '비상사태'라는 새로운 상태를 추가해주십시오. 단, 이 사양에는 문제가 있습니다. 무엇일까요?
비상사태를 나타내느 UrgentState 클래스를 도입한다. 또한 DayState 클래스와 NightState 클래스의 doAlarm에 상태전환의 코드를 추가한다.
+ UrgentState 클래스의 doClock에서는 아무 처리를 하지 않는다. 시간의 개념이 없기 때문
문제점: 비상사태로 전환된 후, 다시 원래의 상태로 복원하는 수단이 없다.