C\#디자인 모델 시리즈 튜 토리 얼-상태 모드

1.개술
대상 의 내 적 상태 가 바 뀌 었 을 때 행동 을 바 꿀 수 있 도록 허용 하 는데,이 대상 은 그 종 류 를 바 꾼 것 처럼 보인다.
2.해결 하 는 문제
대상 의 상태 전환 을 제어 하 는 조건 식 이 너무 복잡 할 때의 상황 을 주로 해결 합 니 다.상태의 판단 논 리 를 서로 다른 일련의 유형 으로 옮 기 면 복잡 한 논리 판단 을 단순화 할 수 있다.
3.모드 속 캐릭터
3.1 컨 텍스트 환경(Context):클 라 이언 트 프로그램 이 필요 로 하 는 인 터 페 이 스 를 정의 하고 구체 적 인 상태 역할 의 인 스 턴 스 를 유지 하 며 상태 와 관련 된 작업 을 현재 Concrete State 대상 에 게 의뢰 합 니 다.
3.2 추상 상태(State):상하 문 환경 을 사용 하 는 특정한 상태 와 관련 된 인 터 페 이 스 를 정의 합 니 다.
3.3 구체 적 인 상태(Concrete State):추상 적 인 상태 정 의 를 실현 하 는 인터페이스.
4.패턴 판독
4.1 상태 모드 의 유형 도
//img.jbzj.com/file_images/article/201606/201606010949065.png
4.2 상태 모드 의 코드 실현

 /// <summary>
 /// Context ,    ConcreteState     ,           。
 /// </summary>
 public class Context
 {
  private State state;
  /// <summary>
  ///   Context     
  /// </summary>
  /// <param name="state"></param>
  public Context(State state)
  {
   this.state = state;
  }

  /// <summary>
  ///         ,          
  /// </summary>
  public State State
  {
   get { return state; }
   set { state = value; }
  }

  /// <summary>
  ///       ,        
  /// </summary>
  public void Request()
  {
   state.Handle(this);
  }
 }

 /// <summary>
 ///      ,          Context            
 /// </summary>
 public abstract class State
 {
  public abstract void Handle(Context context);
 }

 /// <summary>
 ///      ,          Context          
 /// </summary>
 public class ConcreteStateA : State
 {
  /// <summary>
  ///   ConcreteStateA       ConcreteStateB
  /// </summary>
  /// <param name="context"></param>
  public override void Handle(Context context)
  {
   Console.WriteLine("      A.");
   context.State = new ConcreteStateB();
  }
 }

 public class ConcreteStateB : State
 {
  /// <summary>
  ///   ConcreteStateB       ConcreteSateA
  /// </summary>
  /// <param name="context"></param>
  public override void Handle(Context context)
  {
   Console.WriteLine("      B.");
   context.State = new ConcreteStateA();
  }
 }

4.3 클 라 이언 트 호출

 class Program
 {
  static void Main(string[] args)
  {
   //   Context      ConcreteStateA
   Context context = new Context(new ConcreteStateA());

   //        ,      
   context.Request();
   context.Request();
   context.Request();
   context.Request();

   Console.Read();
  }
 }

실행 결과
//img.jbzj.com/file_images/article/201606/201606010949076.png
5.모델 총화
5.1 장점
5.1.1 상태 모델 은 특정한 상태 와 관련 된 행 위 를 국부 화하 고 서로 다른 상태의 행 위 를 분리 한다.
5.1.2 모든 상태 와 관련 된 코드 는 특정한 Concrete State 에 존재 하기 때문에 새로운 하위 클래스 를 정의 함으로써 새로운 상태 와 전환 을 쉽게 추가 할 수 있 습 니 다.
5.1.3 상태 모드 는 각종 상태 전이 논 리 를 State 의 하위 클래스 간 에 구분 하지 못 하 게 함으로써 상호 간 의 의존 을 줄인다.
5.2 단점
5.2.1 많은 Concrete State 하위 클래스
5.3 필드 적용
5.3.1 한 대상 의 행위 가 그의 상태 에 달 려 있 고 운행 시간 에 상태 에 따라 그의 행 위 를 바 꿔 야 할 때 상태 모델 을 사용 하 는 것 을 고려 할 수 있다.
5.3.2 하나의 조작 에는 방대 한 분지 구조 가 포함 되 어 있 고 이 분지 들 은 대상 의 상태 에 결정 된다.
6.예 를 들 어 전등 은 두 가지 상태 가 있 고 켜 기(켜 기)와 끄 기(켜 지지 않 음)가 있 으 며 다음은 상태 모드 로 전등 에 대한 통 제 를 실현 한다.
6.1 분류 도
//img.jbzj.com/file_images/article/201606/201606010949077.png
6.2 구현 코드

 /// <summary>
 ///    ,      Context 
 /// </summary>
 public class Light
 {
  private LightState state;

  public Light(LightState state)
  {
   this.state = state;
  }

  /// <summary>
  ///       
  /// </summary>
  public void PressSwich()
  {
   state.PressSwich(this);
  }

  public LightState State
  {
   get { return state; }
   set { state = value; }
  } 
 }

 /// <summary>
 ///         ,   State 
 /// </summary>
 public abstract class LightState
 {
  public abstract void PressSwich(Light light);
 }

 /// <summary>
 ///      ,  
 /// </summary>
 public class On : LightState
 {
  /// <summary>
  ///      ,            。
  /// </summary>
  /// <param name="light"></param>
  public override void PressSwich(Light light)
  {
   Console.WriteLine("Turn off the light.");

   light.State = new Off();
  }
 }

 /// <summary>
 ///      , 
 /// </summary>
 public class Off: LightState
 {
  /// <summary>
  ///      ,         。
  /// </summary>
  /// <param name="light"></param>
  public override void PressSwich(Light light)
  {
   Console.WriteLine("Turn on the light.");

   light.State = new On();
  }
 }

6.3 클 라 이언 트 코드


 class Program
 {
  static void Main(string[] args)
  {
   //      ,      
   Light light = new Light(new Off());

   //        ,    
   light.PressSwich();
   //        ,    
   light.PressSwich();

   Console.Read();
  }
 }

실행 결과
//img.jbzj.com/file_images/article/201606/201606010949078.png

좋은 웹페이지 즐겨찾기