디자인 모드 시리즈 - 상태 모드
31113 단어 디자인 모드상태 모드C \ # 디자인 모드대화 디자인 모드
1. 응용 장면
아침 8 시 반 에 일어나 머리 를 빗 고 집 을 나 와 천안문 으로 갔 는데 천안문 에 도착 하 니 이렇게 추 운 날 에 사람 이 왜 이렇게 많 지?다 들 나 처럼 뜨 거 운 마음 을 가지 고 있 구나.오문 에 들 어서 자 나 는 갑자기 대사 한 마디 가 생각 났 다. - > "오문 을 내 밀 며 참수 하 자". 갑자기 짝 꿍 이 호랑이 처럼 느껴 졌 다.표를 사서 들 어 온 후에 나의 참관 노선 은 태 화전 도 '금란전' 이 라 고 불 렀 다. > 건 청 궁 - > 어화 원 - > 동 육 궁 - > 구 룡 벽 이다.모든 궁전 을 둘 러 볼 때 내 마음 상 태 는 달 라 졌 다.예 를 들 면:
1. 태화전: 청나라 와 명나라 시대 에 대형 의식 을 거행 하 는 곳 입 니 다. 예 를 들 어 황제의 등극, 대 혼, 황 후 를 책립 하고 출정, 황 방 을 발표 하 는 등 중대 한 의식 이 모두 이곳 에서 거행 되 었 습 니 다. 저 는 황제의 집 거실 이 정말 웅장 하고 웅장 하 다 는 느낌 을 받 았 습 니 다. 그 당시 에 대형 의식 을 거행 하 는 장면 을 상상 하 는 것 이 매우 설 레 었 습 니 다.
2. 건 청 궁: 이 궁전 은 명나라 부터 청나라 강희 년 사이 에 황제 가 거 주 했 고 정 무 를 처리 하 는 침 궁 이 었 습 니 다. 옹정 이 즉위 한 후에 침 궁 을 양심 전 으로 옮 겼 습 니 다. 이곳 은 내정 식 과 관원 을 접견 하 는 곳 이 되 었 습 니 다. 이때 제 마음 은 양심 전이 후궁 과 가 까 워 서 옹정 이 이사 간 것 이 아 닙 니까?
3. 어화 원: 시황 제, 황후 가 식사 후에 휴식 을 취하 고 노 는 장소 입 니 다. 그런데 어화 원 은 정말 생각 보다 예 쁘 지 않 아서 서운 합 니 다.
4. 동 육 궁: 보통 후궁 빈궁 들 이 사 는 곳 이지 만 지금 은 대부분 궁전 이 전시관 이 되 었 습 니 다. 그 당시 빈궁 들 이 살 았 던 환경 이 보이 지 않 고 실의 에 빠 졌 습 니 다.
5. 구 룡 벽: 이 벽 에 아홉 개의 용이 있 는데 고궁 의 유명한 경관 입 니 다. 그 당시 에 이 구 룡 벽 을 구 울 때 공예 요구 가 매우 높 기 때문에 구 워 내기 가 어렵 고 폐품 율 이 높 았 다 고 합 니 다.장인 들 이 조심 하지 않 아 이 백 룡 의 배 를 태 워 버 렸 지만, 그 때 는 이미 다시 태 울 시간 이 충분 하지 않 았 다. 분명히 모두의 목숨 을 잃 을 화가 곧 닥 칠 것 이다.어떤 목수 사 부 는 군 주 를 속 이 는 죄 를 지 을 생명의 위험 을 무릅 쓰 고 밤새 나무 로 용의 배 를 조각 하여 못 을 박 고 흰색 페인트 를 칠 하여 원래 의 백 룡 배 와 색깔 을 똑 같이 만 들 었 다. 마침내 검사 하 러 온 관 리 를 속 이 고 장인 들 로 하여 금 재난 을 면 하 게 했다.삼십육계 의 중요성 을 문득 깨 달 았 다.
디자인 모드 써 야 되 는 거 아니 야?결국 처음에는 쓸데없는 말 을 많이 했 어 요. 하하, 그럼 코드 로 오늘 고궁 을 유람 하 는 장면 을 실현 해 보 세 요.
첫 번 째 단계: 먼저 저 는 다섯 곳 의 관광 지 를 참관 할 수 있 습 니 다. 먼저 다섯 곳 의 관광 지 를 매 거 진 유형 으로 정의 할 수 있 습 니 다. 코드 는 다음 과 같 습 니 다.
- ///
- ///
- ///
- enum ImperialPalaceEnum
- {
- ,
- ,
- ,
- ,
-
- }
두 번 째 단계: 제 가 관광 지 를 방문 할 때마다 심리 상태의 변 화 를 실현 합 니 다. 코드 는 다음 과 같 습 니 다.
- ///
- ///
- ///
- public class IPVisit
- {
- ///
- ///
- ///
- private ImperialPalaceEnum ipCurrentSpot;
- public ImperialPalaceEnum IpCurrentSpot
- {
- set
- {
- ipCurrentSpot = value;
- }
- }
-
- ///
- ///
- ///
- public void ExperienceSpot()
- {
- //
- switch (ipCurrentSpot)
- {
- case ImperialPalaceEnum. :
- Console.WriteLine(" : , !");
- break;
- case ImperialPalaceEnum. :
- Console.WriteLine(" : ?");
- break;
- case ImperialPalaceEnum. :
- Console.WriteLine(" : , .");
- break;
- case ImperialPalaceEnum. :
- Console.WriteLine(" : , .");
- break;
- case ImperialPalaceEnum. :
- Console.WriteLine(" : , .");
- break;
- }
- }
세 번 째 단계: 주 함수 호출 코드 는 다음 과 같 습 니 다.
- IPVisit visit = new IPVisit();
-
- visit.IpCurrentSpot = ImperialPalaceEnum. ;
- visit.ExperienceSpot();
-
- visit.IpCurrentSpot = ImperialPalaceEnum. ;
- visit.ExperienceSpot();
-
- visit.IpCurrentSpot = ImperialPalaceEnum. ;
- visit.ExperienceSpot();
-
- visit.IpCurrentSpot = ImperialPalaceEnum. ;
- visit.ExperienceSpot();
-
- visit.IpCurrentSpot = ImperialPalaceEnum. ;
- 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 클래스 는 현재 상 태 를 유지 하 는 인 스 턴 스 로 현재 상 태 를 표시 합 니 다. 코드 는 다음 과 같 습 니 다.
- ///
- ///
- ///
- public class Context
- {
- public Context() { }
- public Context(State state)
- {
- this.currentState = state;
- }
- private State currentState;
- public State CurrentState
- {
- set
- {
- currentState = value;
- }
- }
-
- ///
- ///
- ///
- public void Request()
- {
- currentState.Handle(this);
- }
State 인터페이스: Context 에 필요 한 상태 행위 의 추상.코드 는 다음 과 같 습 니 다:
- public interface State
- {
- void Handle(Context context);
- }
ConcretState 클래스: State 의 추상 에 따라 Context 에 필요 한 상태 행 위 를 실현 한 실례 입 니 다. 코드 는 다음 과 같 습 니 다.
- ///
- /// ,
- ///
- public class ConcereteStateA : State
- {
- public void Handle(Context context)
- {
- Console.WriteLine(" A: ..... B......");
- context.CurrentState = new ConcereteStateB();
- }
- }
-
- ///
- /// ,
- ///
- public class ConcereteStateB : State
- {
- public void Handle(Context context)
- {
- Console.WriteLine(" B: ..... A......");
- context.CurrentState = new ConcereteStateA();
- }
- }
주 함수 호출 은 다음 과 같 습 니 다:
- Context context = new Context(new ConcereteStateA());
- context.Request();
- context.Request();
출력 결 과 는 다음 과 같 습 니 다.
A: ..... B......
B: ..... A......
4. 상태 모드 의 장점 특정 상태의 행 위 를 분리 하 는 것 은 상태 모드 가 모든 상태의 행 위 를 구체 적 인 대상 에 넣 고 상태의 추상 화 (인터페이스 State) 를 실현 함으로써 새로운 상 태 를 쉽게 증가 시 킬 수 있 기 때문이다.
3. 고궁 관광 의 상태 모델 실현
우선, 저 는 관광 (Visit) 을 할 때 서로 다른 관광 지 를 구경 하고 모든 관광 지 를 체험 할 때 제 마음 상태 가 달라 집 니 다. 즉, 제 가 관광 지 를 방문 할 때마다 해당 하 는 상태 가 생 긴 다 는 것 입 니 다.이때 모든 관광 지 는 구체 적 인 상태 에 대응 하여 이 루어 져 야 한다.그래서 저 는 서로 다른 관광 지 를 참관 할 때 현재 상태 인 스 턴 스 도 따라 전환 해 야 합 니 다. 유형 도 는 다음 과 같 습 니 다.
먼저 고궁 류 를 구경 하 는 것 을 실현 하고 관광 지 를 방문 할 때마다 제 마음 속 의 상 태 를 바 꿉 니 다. 그래서 이때 현재 상 태 를 대표 하 는 속성 이 필요 합 니 다. 이 관광 지 를 체험 할 때 해당 하 는 상 태 를 수행 합 니 다.코드 는 다음 과 같 습 니 다:
- ///
- ///
- ///
- public class IPVisitContext
- {
- public IPVisitContext() { }
- public IPVisitContext(ISpotState state)
- {
- this.currentState = state;
- }
-
- ///
- ///
- ///
- private ISpotState currentState;
- public ISpotState CurrentState
- {
- set
- {
- currentState = value;
- }
- }
-
- ///
- ///
- ///
- public void ExperienceSpot()
- {
- currentState.ExperienceSpot(this);
- }
- }
모든 관광지 에 서로 다른 상태 인 스 턴 스 가 있 습 니 다. 이 때 는 하나의 상태의 추상 이 필요 합 니 다. 사용 자 는 앞으로 새로운 상태 인 스 턴 스 를 쉽게 확장 할 수 있 습 니 다. 코드 는 다음 과 같 습 니 다.
- ///
- ///
- ///
- public interface ISpotState
- {
- void ExperienceSpot(IPVisitContext context);
- }
다음은 모든 관광지 가 대응 하 는 상태 가 실현 되 었 고 코드 는 다음 과 같다.
- ///
- ///
- ///
- public class State : ISpotState
- {
- public void ExperienceSpot(IPVisitContext context)
- {
- Console.WriteLine(" : , !");
- context.CurrentState = new State();
- }
- }
- ///
- ///
- ///
- public class State : ISpotState
- {
- public void ExperienceSpot(IPVisitContext context)
- {
- Console.WriteLine(" : ?");
- context.CurrentState = new State();
- }
- }
- ///
- ///
- ///
- public class State : ISpotState
- {
- public void ExperienceSpot(IPVisitContext context)
- {
- Console.WriteLine(" : , .");
- context.CurrentState = new State();
- }
- }
- ///
- ///
- ///
- public class State : ISpotState
- {
- public void ExperienceSpot(IPVisitContext context)
- {
- Console.WriteLine(" : , .");
- context.CurrentState = new State();
- }
- }
- ///
- ///
- ///
- public class State : ISpotState
- {
- public void ExperienceSpot(IPVisitContext context)
- {
- Console.WriteLine(" : , .");
- }
- }
주 함수 호출 은 다음 과 같 습 니 다:
- IPVisitContext context = new IPVisitContext(new State());//
- context.ExperienceSpot();
- context.ExperienceSpot();
- context.ExperienceSpot();
- context.ExperienceSpot();
- context.ExperienceSpot();
실행 결 과 는 다음 과 같 습 니 다.
1 : , !
2 : ?
3 : , .
4 : , .
5 : , .
6 . . .
그러면 반나절 동안 상태 모드 의 장점 을 말 했 습 니 다. 그러면 어떻게 유연 하 게 상 태 를 확장 할 수 있 습 니까?예 를 들 어 우 리 는 지금 관광지 에 가입 하여 신 무 문, 즉 출 궁 출구 를 참관 해 야 한다. 우 리 는 다음 과 같은 몇 걸음 만 하면 된다. 첫 번 째 단계: 신 무 문 상태의 클래스 를 추가 합 니 다. 코드 는 다음 과 같 습 니 다.
- ///
- ///
- ///
- public class State : ISpotState
- {
- public void ExperienceSpot(IPVisitContext context)
- {
- Console.WriteLine(" : .");
- }
- }
두 번 째 단계: 구 룡 벽의 다음 상 태 를 신 무 문 상태 로 연결 합 니 다. 코드 는 다음 과 같 습 니 다.
- ///
- ///
- ///
- public class State : ISpotState
- {
- public void ExperienceSpot(IPVisitContext context)
- {
- Console.WriteLine(" : , .");
- context.CurrentState = new State();
- }
- }
OK 상태 모드 가 성공 한 것 도 추 운 날 고궁 에 다 녀 온 영감 이 헛 되 지 않 았 습 니 다.응원 해 주시 면 감사 하 겠 습 니 다. 좋아요!감사합니다, 감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.