디자인 모드 시리즈 - 상태 모드

최근 에 인기 리 에 방 송 된 청 궁 드라마 '견 환전' 의 영향 으로 인해 저 는 고궁 에 다시 가 고 싶 은 마음 이 생 겼 습 니 다. 과거 에 황제 와 후궁 들 이 살 았 던 곳 을 보고 싶 어서 오늘 은 생각 을 행동 에 부 여 했 습 니 다. 날씨 가 추 웠 지만 제 뜨 거 운 마음 을 막 을 수 없 었 습 니 다.
1. 응용 장면
     아침 8 시 반 에 일어나 머리 를 빗 고 집 을 나 와 천안문 으로 갔 는데 천안문 에 도착 하 니 이렇게 추 운 날 에 사람 이 왜 이렇게 많 지?다 들 나 처럼 뜨 거 운 마음 을 가지 고 있 구나.오문 에 들 어서 자 나 는 갑자기 대사 한 마디 가 생각 났 다. - > "오문 을 내 밀 며 참수 하 자". 갑자기 짝 꿍 이 호랑이 처럼 느껴 졌 다.표를 사서 들 어 온 후에 나의 참관 노선 은 태 화전 도 '금란전' 이 라 고 불 렀 다. > 건 청 궁 - > 어화 원 - > 동 육 궁 - > 구 룡 벽 이다.모든 궁전 을 둘 러 볼 때 내 마음 상 태 는 달 라 졌 다.예 를 들 면:
     1. 태화전: 청나라 와 명나라 시대 에 대형 의식 을 거행 하 는 곳 입 니 다. 예 를 들 어 황제의 등극, 대 혼, 황 후 를 책립 하고 출정, 황 방 을 발표 하 는 등 중대 한 의식 이 모두 이곳 에서 거행 되 었 습 니 다. 저 는 황제의 집 거실 이 정말 웅장 하고 웅장 하 다 는 느낌 을 받 았 습 니 다. 그 당시 에 대형 의식 을 거행 하 는 장면 을 상상 하 는 것 이 매우 설 레 었 습 니 다.
     2. 건 청 궁: 이 궁전 은 명나라 부터 청나라 강희 년 사이 에 황제 가 거 주 했 고 정 무 를 처리 하 는 침 궁 이 었 습 니 다. 옹정 이 즉위 한 후에 침 궁 을 양심 전 으로 옮 겼 습 니 다. 이곳 은 내정 식 과 관원 을 접견 하 는 곳 이 되 었 습 니 다. 이때 제 마음 은 양심 전이 후궁 과 가 까 워 서 옹정 이 이사 간 것 이 아 닙 니까?
     3. 어화 원: 시황 제, 황후 가 식사 후에 휴식 을 취하 고 노 는 장소 입 니 다. 그런데 어화 원 은 정말 생각 보다 예 쁘 지 않 아서 서운 합 니 다.
     4. 동 육 궁: 보통 후궁 빈궁 들 이 사 는 곳 이지 만 지금 은 대부분 궁전 이 전시관 이 되 었 습 니 다. 그 당시 빈궁 들 이 살 았 던 환경 이 보이 지 않 고 실의 에 빠 졌 습 니 다.
     5. 구 룡 벽: 이 벽 에 아홉 개의 용이 있 는데 고궁 의 유명한 경관 입 니 다. 그 당시 에 이 구 룡 벽 을 구 울 때 공예 요구 가 매우 높 기 때문에 구 워 내기 가 어렵 고 폐품 율 이 높 았 다 고 합 니 다.장인 들 이 조심 하지 않 아 이 백 룡 의 배 를 태 워 버 렸 지만, 그 때 는 이미 다시 태 울 시간 이 충분 하지 않 았 다. 분명히 모두의 목숨 을 잃 을 화가 곧 닥 칠 것 이다.어떤 목수 사 부 는 군 주 를 속 이 는 죄 를 지 을 생명의 위험 을 무릅 쓰 고 밤새 나무 로 용의 배 를 조각 하여 못 을 박 고 흰색 페인트 를 칠 하여 원래 의 백 룡 배 와 색깔 을 똑 같이 만 들 었 다. 마침내 검사 하 러 온 관 리 를 속 이 고 장인 들 로 하여 금 재난 을 면 하 게 했다.삼십육계 의 중요성 을 문득 깨 달 았 다.
    디자인 모드 써 야 되 는 거 아니 야?결국 처음에는 쓸데없는 말 을 많이 했 어 요. 하하, 그럼 코드 로 오늘 고궁 을 유람 하 는 장면 을 실현 해 보 세 요.
    첫 번 째 단계: 먼저 저 는 다섯 곳 의 관광 지 를 참관 할 수 있 습 니 다. 먼저 다섯 곳 의 관광 지 를 매 거 진 유형 으로 정의 할 수 있 습 니 다. 코드 는 다음 과 같 습 니 다.
   
   
   
   
  1. ///   
  2. ///   
  3. ///   
  4. enum ImperialPalaceEnum   
  5. {  
  6.      ,  
  7.      ,  
  8.      ,  
  9.      ,  
  10.       

   두 번 째 단계: 제 가 관광 지 를 방문 할 때마다 심리 상태의 변 화 를 실현 합 니 다. 코드 는 다음 과 같 습 니 다.
   
   
   
   
  1.  ///   
  2. ///   
  3. ///   
  4. public class IPVisit  
  5. {  
  6.     ///   
  7.     ///   
  8.     ///   
  9.     private ImperialPalaceEnum ipCurrentSpot;  
  10.    public ImperialPalaceEnum IpCurrentSpot  
  11.    {  
  12.        set 
  13.        {  
  14.            ipCurrentSpot = value;  
  15.        }  
  16.    }  
  17.  
  18.    ///   
  19.    ///   
  20.    ///   
  21.    public void ExperienceSpot()  
  22.    {  
  23.        //  
  24.        switch (ipCurrentSpot)  
  25.        {  
  26.            case ImperialPalaceEnum. :  
  27.                Console.WriteLine(" : , !");  
  28.                break;  
  29.            case ImperialPalaceEnum. :  
  30.                Console.WriteLine(" : ?");  
  31.                break;  
  32.            case ImperialPalaceEnum. :  
  33.                Console.WriteLine(" : , .");  
  34.                break;  
  35.            case ImperialPalaceEnum. :  
  36.                Console.WriteLine(" : , .");  
  37.                break;  
  38.            case ImperialPalaceEnum. :  
  39.                Console.WriteLine(" : , .");  
  40.                break;  
  41.        }  
  42.    }  

   세 번 째 단계: 주 함수 호출 코드 는 다음 과 같 습 니 다.
   
   
   
   
  1.   IPVisit visit = new IPVisit();  
  2.  
  3.  visit.IpCurrentSpot = ImperialPalaceEnum. ;  
  4.  visit.ExperienceSpot();  
  5.  
  6.  visit.IpCurrentSpot = ImperialPalaceEnum. ;  
  7.  visit.ExperienceSpot();  
  8.  
  9.  visit.IpCurrentSpot = ImperialPalaceEnum. ;  
  10. visit.ExperienceSpot();  
  11.  
  12. visit.IpCurrentSpot = ImperialPalaceEnum. ;  
  13. visit.ExperienceSpot();  
  14.  
  15. visit.IpCurrentSpot = ImperialPalaceEnum. ;  
  16. visit.ExperienceSpot(); 

  실행 결 과 는:
1    :              ,                     !
2    :                      ?
3              ,    .
4                ,    .
5    :    ,            .
6        . . .

 상태 모드
     위의 코드 를 분석 하면 우 리 는 고궁 IPVisit 를 참관 하 는 대상 의 행 위 는 그의 상태 에 달 려 있다 는 것 을 알 수 있다. 예 를 들 어 ipCurrentEnum 속성 이 서로 다른 속성 치 와 같 을 때 관광지 방법 을 체험 할 수 있다. Experience Spot 이 하 는 행 위 는 다르다.이렇게 되면 먼저 우리 의 한 방법 에 서로 다른 직책 이 생 길 것 이다. 만약 에 이 방법의 책임 이 너무 많 으 면 유지 하 는 것 이 골 치 아 플 것 이다. 예 를 들 어 위의 장면 코드 중의 두 번 째 단계 의 코드 를 보면 switch 중의 모든 case 와 break 사이 에 하나의 상태 가 나타 나 는 행 위 를 볼 수 있다.그러면 이때 관광지 (상태) 가 추가 되면 이곳 의 코드 를 수정 해 야 하기 때문에 '개방 - 폐쇄 원칙' 에 위배 된다.이때 누군가가 우리 가 필요 로 하 는 것 이 그렇게 복잡 하지 않다 고 말 할 것 이다. 나 는 switch 로 이렇게 실현 하면 매우 좋다 고 생각한다. 간단 하면 서도 명료 하 다 는 점 에 나 도 매우 찬성한다. 디자인 은 실제 수요 에 따라 맞 춤 형 디자인 을 주문 하 는 것 이 가장 좋 은 디자인 이 라 고 생각한다.말 이 좀 멀 어 졌 습 니 다. 그러면 어떻게 우리 위의 코드 를 최적화 시 켜 서 유연 한 확장 상 태 를 복잡 도 를 낮 출 수 있 습 니까?걱정 하지 마 세 요. 디자인 모델 4 인방 선배 들 은 이미 이런 문제 에 있어 완벽 한 해결 방안 을 제 시 했 습 니 다. 상태 모델 이 성대하게 등장 합 니 다!
     1. 상태 모드 는 무엇 입 니까?
         디자인 모델 이라는 책 은 한 대상 이 내부 상태 가 바 뀌 었 을 때 행동 을 바 꾸 고 대상 이 종 류 를 수정 하 는 것 처럼 보인다 고 정의 했다.
      2. 상태 패턴 도표
      Context: 한 상태의 인 스 턴 스 를 유지 합 니 다. 이 인 스 턴 스 는 현재 상 태 를 정의 합 니 다.
      State: 이 인 터 페 이 스 는 추상 적 인 Context 의 특정한 상태 와 관련 된 행위 입 니 다.
      Concrete State: Context 의 구체 적 인 상 태 를 실현 하 는 행위.
      3. 상태 모드 코드 구현
        Context 클래스 는 현재 상 태 를 유지 하 는 인 스 턴 스 로 현재 상 태 를 표시 합 니 다. 코드 는 다음 과 같 습 니 다.
   
   
   
   
  1.  ///   
  2. ///   
  3. ///   
  4. public class Context  
  5. {  
  6.     public Context() { }  
  7.     public Context(State state)  
  8.     {  
  9.         this.currentState = state;  
  10.    }  
  11.    private State currentState;  
  12.    public State CurrentState  
  13.    {  
  14.        set 
  15.        {  
  16.            currentState = value;  
  17.        }  
  18.    }  
  19.  
  20.    ///   
  21.    ///   
  22.    ///   
  23.    public void Request()  
  24.    {  
  25.        currentState.Handle(this);  
  26.    }  

   State 인터페이스: Context 에 필요 한 상태 행위 의 추상.코드 는 다음 과 같 습 니 다:
   
   
   
   
  1. public interface State  
  2. {  
  3.     void Handle(Context context);  

   ConcretState 클래스: State 의 추상 에 따라 Context 에 필요 한 상태 행 위 를 실현 한 실례 입 니 다. 코드 는 다음 과 같 습 니 다.
   
   
   
   
  1. ///   
  2. ///  ,  
  3. ///   
  4. public class ConcereteStateA : State  
  5. {  
  6.     public void Handle(Context context)  
  7.     {  
  8.         Console.WriteLine(" A: ..... B......");  
  9.         context.CurrentState = new ConcereteStateB();  
  10.     }  
  11. }  
  12.  
  13. ///   
  14. ///  ,  
  15. ///   
  16. public class ConcereteStateB : State  
  17. {  
  18.     public void Handle(Context context)  
  19.     {  
  20.         Console.WriteLine(" B: ..... A......");  
  21.         context.CurrentState = new ConcereteStateA();  
  22.     }  

  주 함수 호출 은 다음 과 같 습 니 다:
   
   
   
   
  1. Context context = new Context(new ConcereteStateA());  
  2. context.Request();  
  3. context.Request(); 

 
  출력 결 과 는 다음 과 같 습 니 다.
  A:       .....       B......
  B:       .....       A......

 4. 상태 모드 의 장점      특정 상태의 행 위 를 분리 하 는 것 은 상태 모드 가 모든 상태의 행 위 를 구체 적 인 대상 에 넣 고 상태의 추상 화 (인터페이스 State) 를 실현 함으로써 새로운 상 태 를 쉽게 증가 시 킬 수 있 기 때문이다.
 3. 고궁 관광 의 상태 모델 실현
       우선, 저 는 관광 (Visit) 을 할 때 서로 다른 관광 지 를 구경 하고 모든 관광 지 를 체험 할 때 제 마음 상태 가 달라 집 니 다. 즉, 제 가 관광 지 를 방문 할 때마다 해당 하 는 상태 가 생 긴 다 는 것 입 니 다.이때 모든 관광 지 는 구체 적 인 상태 에 대응 하여 이 루어 져 야 한다.그래서 저 는 서로 다른 관광 지 를 참관 할 때 현재 상태 인 스 턴 스 도 따라 전환 해 야 합 니 다. 유형 도 는 다음 과 같 습 니 다.
       먼저 고궁 류 를 구경 하 는 것 을 실현 하고 관광 지 를 방문 할 때마다 제 마음 속 의 상 태 를 바 꿉 니 다. 그래서 이때 현재 상 태 를 대표 하 는 속성 이 필요 합 니 다. 이 관광 지 를 체험 할 때 해당 하 는 상 태 를 수행 합 니 다.코드 는 다음 과 같 습 니 다:
   
   
   
   
  1.   ///   
  2.  ///   
  3.  ///   
  4.  public class IPVisitContext  
  5.  {  
  6.      public IPVisitContext() { }  
  7.      public IPVisitContext(ISpotState state)   
  8.      {  
  9.          this.currentState = state;  
  10.     }  
  11.  
  12.     ///   
  13.     ///   
  14.     ///   
  15.     private ISpotState currentState;  
  16.     public ISpotState CurrentState  
  17.     {  
  18.         set 
  19.         {  
  20.             currentState = value;  
  21.         }  
  22.     }  
  23.  
  24.     ///   
  25.     ///     
  26.     ///   
  27.     public void ExperienceSpot()  
  28.     {  
  29.         currentState.ExperienceSpot(this);  
  30.     }  

 
 모든 관광지 에 서로 다른 상태 인 스 턴 스 가 있 습 니 다. 이 때 는 하나의 상태의 추상 이 필요 합 니 다. 사용 자 는 앞으로 새로운 상태 인 스 턴 스 를 쉽게 확장 할 수 있 습 니 다. 코드 는 다음 과 같 습 니 다.
   
   
   
   
  1.  ///   
  2. ///   
  3. ///   
  4. public interface ISpotState  
  5. {  
  6.     void ExperienceSpot(IPVisitContext context);  

다음은 모든 관광지 가 대응 하 는 상태 가 실현 되 었 고 코드 는 다음 과 같다.
   
   
   
   
  1.   ///   
  2.  ///   
  3.  ///   
  4.  public class  State : ISpotState  
  5.  {  
  6.      public void ExperienceSpot(IPVisitContext context)  
  7.      {  
  8.          Console.WriteLine(" :  , !");  
  9.          context.CurrentState = new  State();  
  10.     }  
  11. }  
  12. ///   
  13. ///   
  14. ///   
  15. public class  State : ISpotState  
  16. {  
  17.     public void ExperienceSpot(IPVisitContext context)  
  18.     {  
  19.         Console.WriteLine(" : ?");  
  20.         context.CurrentState = new  State();  
  21.     }  
  22. }  
  23. ///   
  24. ///   
  25. ///   
  26. public class  State : ISpotState  
  27. {  
  28.     public void ExperienceSpot(IPVisitContext context)  
  29.     {  
  30.         Console.WriteLine(" : , .");  
  31.         context.CurrentState = new  State();  
  32.     }  
  33. }  
  34. ///   
  35. ///   
  36. ///   
  37. public class  State : ISpotState  
  38. {  
  39.     public void ExperienceSpot(IPVisitContext context)  
  40.     {  
  41.         Console.WriteLine(" : , .");  
  42.         context.CurrentState = new  State();  
  43.     }  
  44. }  
  45. ///   
  46. ///   
  47. ///   
  48. public class  State : ISpotState  
  49. {  
  50.     public void ExperienceSpot(IPVisitContext context)  
  51.     {  
  52.         Console.WriteLine(" : , .");  
  53.     }  

 
  주 함수 호출 은 다음 과 같 습 니 다:
   
   
   
   
  1. IPVisitContext context = new IPVisitContext(new  State());//  
  2.  context.ExperienceSpot();  
  3.  context.ExperienceSpot();  
  4.  context.ExperienceSpot();  
  5.  context.ExperienceSpot();  
  6.  context.ExperienceSpot(); 

  실행 결 과 는 다음 과 같 습 니 다.
1     :              ,                     !
2     :                      ?
3     :              ,    .
4     :                ,    .
5     :    ,            .
6         . . .

 그러면 반나절 동안 상태 모드 의 장점 을 말 했 습 니 다. 그러면 어떻게 유연 하 게 상 태 를 확장 할 수 있 습 니까?예 를 들 어 우 리 는 지금 관광지 에 가입 하여 신 무 문, 즉 출 궁 출구 를 참관 해 야 한다. 우 리 는 다음 과 같은 몇 걸음 만 하면 된다. 첫 번 째 단계: 신 무 문 상태의 클래스 를 추가 합 니 다. 코드 는 다음 과 같 습 니 다.
   
   
   
   
  1. ///   
  2. ///   
  3. ///   
  4. public class  State : ISpotState  
  5. {  
  6.     public void ExperienceSpot(IPVisitContext context)  
  7.     {  
  8.         Console.WriteLine(" : .");  
  9.     }  

 두 번 째 단계: 구 룡 벽의 다음 상 태 를 신 무 문 상태 로 연결 합 니 다. 코드 는 다음 과 같 습 니 다.
   
   
   
   
  1.   ///   
  2.  ///   
  3.  ///   
  4.  public class  State : ISpotState  
  5.  {  
  6.      public void ExperienceSpot(IPVisitContext context)  
  7.      {  
  8.          Console.WriteLine(" : , .");  
  9.          context.CurrentState = new  State();  
  10.     }  

OK 상태 모드 가 성공 한 것 도 추 운 날 고궁 에 다 녀 온 영감 이 헛 되 지 않 았 습 니 다.응원 해 주시 면 감사 하 겠 습 니 다. 좋아요!감사합니다, 감사합니다!

좋은 웹페이지 즐겨찾기