State Pattern ②
2007. 9. 27. 09:23ㆍDesign Patterns
그래서 바꿔봤습니다. -_- 클래스 이름이 NewWife 라고 하지만.. 새엄마 생각하지말고.. (내지는 새 마누라;;) 객체지향 디자인 패턴으로 돌아온 와이프 라고 생각하세요 -_-;; 푸하하;;; 좀 웃기긴 하지만.. 일단은 스테이트 패턴에서는 아까 가족구성원의 변화를 생각하서.. 가족구성원의 추가 제거가 쉽도록 하는 방법에 좀 신경을 써봤습니다.
가장 먼저 생성되는건 인터페이스입니다.
그럼 Wife 클래스는 어떻게 바뀌었는지 한번 보겠습니다.
그러면 한번 그림을 그려볼까요.. UML을요.. -ㅅ- ㅋ
이런 그림이 나오는군요.. 근데 왜 FamilyState를 구현하는 클래스가 전부다 Wife 인스턴스를 다 가지고 있었을까요...? 이런 그림을 옵져버 패턴에서 봤던거 같은데요.. 그리고 옵져버 패턴에서는 저런 인스턴스를 가지는것을 왜 상속을 이용해서 해결하지 않았을까 했었는데.. 지금 이와 같은 그림의 경우에는 인터페이스 이므로.. 어쩔 수 없이 인스턴스를 다 가져야만 하는것이고.. 그럼 존재의 이유는 뭘까요...?
FamilyState의 생성자를 보면 알수 있는데요.. 죠기 위에 보면 소스가 있으니 살펴보시면서.. ㅋ FamilyState 의 객체들을 초기화 하는데 의미가 있다고도 할 수 있구요.. 하지만 예시가 그다지 적절한것 같지는 않습니다. 디자인 패턴의 일반화된 UML이랑 약간 핀트가 안 맞아서 혼동이 될 수 있는거 같네요..
아직 더 공부할 패턴이기 때문에 맺음말을 쓰지 않겠습니다.
가장 먼저 생성되는건 인터페이스입니다.
이건 어떤 상태(대상)이냐에 따라서 변하는 액션, 그리고 공통적으로 있는 메소드들을 추출해서 만든 인터페이스 입니다. 그럼.. 이전에 있었던 남편이나 아들, 딸을 가지고 이 인터페이스를 구현하는 클래스들을 생성을 해야합니다. 단적인 예로 남편 클래스만 잠깐 보실까요?
public interface FamilyState {
public void earnMoney();
public void comeHomeInMidnight();
public void nagInHoliday();
public void cheerUp();
public void tellALie();
}
일단은 지저분한 조건문들을 사라지고.. 대신에 와이프에 대한 정보를 가지고 있습니다. 이전 디자인 패턴이 그랬듯이 구성을 활용한거죠.. 그 이유는 차차 알아 보도록 하구요..public class HusbandState implements FamilyState {
NewWife wife;
public HusbandState(NewWife wife) {
this.wife = wife;
}
public void cheerUp() {
System.out.println("여보 힘내.. 당신 없으면 우리 식구들 아무도 못살아..");
}
public void comeHomeInMidnight() {
System.out.println("나가!! 왜들어왔어?? 나가 나가 나가 나가!");
}
public void earnMoney() {
System.out.println("딴데 몰래 숨겨논 돈은 없지..?");
}
public void nagInHoliday() {
System.out.println("주말이면 좀 외출도 하고 여가 생활을 좀 하자~ 맨날 집에서 잠만 자냐..");
}
public void tellALie() {
System.out.println("화 안낼 테니까 솔직히 말해봐.. 어제 카드 값 어디서 썼어..?");
}
}
그럼 Wife 클래스는 어떻게 바뀌었는지 한번 보겠습니다.
이 클래스에서는 반대로 FamilyState 인터페이스를 구현하는 모든 클래스에 대한 정보를 가지고 있군요.. 또 재미있는건 FamilyState 인터페이스의 인스턴스도 하나 가지고 있습니다.public class NewWife {
DaughterState d;
HusbandState h;
SonState s;
FamilyState state;
public NewWife() {
d = new DaughterState(this);
h = new HusbandState(this);
s = new SonState(this);
state = h;
}
public void earnMoney() {
state.earnMoney();
}
public void comeHomeInMidnight() {
state.comeHomeInMidnight();
}
public void nagInHoliday() {
state.nagInHoliday();
}
public void cheerUp() {
state.cheerUp();
}
public void tellALie() {
state.tellALie();
}
public void setState(FamilyState newFamily) {
this.state = newFamily;
}
}
그러면 한번 그림을 그려볼까요.. UML을요.. -ㅅ- ㅋ
이런 그림이 나오는군요.. 근데 왜 FamilyState를 구현하는 클래스가 전부다 Wife 인스턴스를 다 가지고 있었을까요...? 이런 그림을 옵져버 패턴에서 봤던거 같은데요.. 그리고 옵져버 패턴에서는 저런 인스턴스를 가지는것을 왜 상속을 이용해서 해결하지 않았을까 했었는데.. 지금 이와 같은 그림의 경우에는 인터페이스 이므로.. 어쩔 수 없이 인스턴스를 다 가져야만 하는것이고.. 그럼 존재의 이유는 뭘까요...?
FamilyState의 생성자를 보면 알수 있는데요.. 죠기 위에 보면 소스가 있으니 살펴보시면서.. ㅋ FamilyState 의 객체들을 초기화 하는데 의미가 있다고도 할 수 있구요.. 하지만 예시가 그다지 적절한것 같지는 않습니다. 디자인 패턴의 일반화된 UML이랑 약간 핀트가 안 맞아서 혼동이 될 수 있는거 같네요..
아직 더 공부할 패턴이기 때문에 맺음말을 쓰지 않겠습니다.