본문 바로가기

Design Patterns

State Pattern ②

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
그래서 바꿔봤습니다. -_- 클래스 이름이 NewWife 라고 하지만.. 새엄마 생각하지말고.. (내지는 새 마누라;;) 객체지향 디자인 패턴으로 돌아온 와이프 라고 생각하세요 -_-;; 푸하하;;; 좀 웃기긴 하지만.. 일단은 스테이트 패턴에서는 아까 가족구성원의 변화를 생각하서.. 가족구성원의 추가 제거가 쉽도록 하는 방법에 좀 신경을 써봤습니다.

가장 먼저 생성되는건 인터페이스입니다.

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 클래스는 어떻게 바뀌었는지 한번 보겠습니다.


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;
   }
}
이 클래스에서는 반대로 FamilyState 인터페이스를 구현하는 모든 클래스에 대한 정보를 가지고 있군요.. 또 재미있는건 FamilyState 인터페이스의 인스턴스도 하나 가지고 있습니다.

그러면 한번 그림을 그려볼까요.. UML을요.. -ㅅ- ㅋ

사용자 삽입 이미지
이런 그림이 나오는군요.. 근데 왜 FamilyState를 구현하는 클래스가 전부다 Wife 인스턴스를 다 가지고 있었을까요...? 이런 그림을 옵져버 패턴에서 봤던거 같은데요.. 그리고 옵져버 패턴에서는 저런 인스턴스를 가지는것을 왜 상속을 이용해서 해결하지 않았을까 했었는데.. 지금 이와 같은 그림의 경우에는 인터페이스 이므로.. 어쩔 수 없이 인스턴스를 다 가져야만 하는것이고.. 그럼 존재의 이유는 뭘까요...?

FamilyState의 생성자를 보면 알수 있는데요.. 죠기 위에 보면 소스가 있으니 살펴보시면서.. ㅋ FamilyState 의 객체들을 초기화 하는데 의미가 있다고도 할 수 있구요.. 하지만 예시가 그다지 적절한것 같지는 않습니다. 디자인 패턴의 일반화된 UML이랑 약간 핀트가 안 맞아서 혼동이 될 수 있는거 같네요..

아직 더 공부할 패턴이기 때문에 맺음말을 쓰지 않겠습니다.