C\#디자인 모델 시리즈 튜 토리 얼-상태 모드
대상 의 내 적 상태 가 바 뀌 었 을 때 행동 을 바 꿀 수 있 도록 허용 하 는데,이 대상 은 그 종 류 를 바 꾼 것 처럼 보인다.
2.해결 하 는 문제
대상 의 상태 전환 을 제어 하 는 조건 식 이 너무 복잡 할 때의 상황 을 주로 해결 합 니 다.상태의 판단 논 리 를 서로 다른 일련의 유형 으로 옮 기 면 복잡 한 논리 판단 을 단순화 할 수 있다.
3.모드 속 캐릭터
3.1 컨 텍스트 환경(Context):클 라 이언 트 프로그램 이 필요 로 하 는 인 터 페 이 스 를 정의 하고 구체 적 인 상태 역할 의 인 스 턴 스 를 유지 하 며 상태 와 관련 된 작업 을 현재 Concrete State 대상 에 게 의뢰 합 니 다.
3.2 추상 상태(State):상하 문 환경 을 사용 하 는 특정한 상태 와 관련 된 인 터 페 이 스 를 정의 합 니 다.
3.3 구체 적 인 상태(Concrete State):추상 적 인 상태 정 의 를 실현 하 는 인터페이스.
4.패턴 판독
4.1 상태 모드 의 유형 도
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();
}
}
실행 결과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 분류 도
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();
}
}
실행 결과이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.