상태 정의 : 다른 상태, 다른 행동, 즉 각 주에는 해당 행동이 있습니다.
상태 모드를 사용하는 시점
상태 모드는 실제 사용에 더 일반적으로 사용되며 "상태 전환"에 적합합니다. 우리는 종종 다른 상태를 전환하기 위해 다른 경우에 사용하기 때문에,이 상태 판단이 반복되면, 우리는 상태 모드를 채택 할 수 있는지에 대해 생각해야합니다.
상태뿐만 아니라 속성을 기반으로합니다. 객체의 속성이 다르면 객체의 동작은 데이터베이스 시스템에서 자주 발생합니다. 속성, 이러한 변경 (스위칭)은 언제든지 발생할 수 있으므로 상태를 사용할 수 있습니다.
실제로 사용하면 스위치와 유사한 상태 스위치가 많이 있지만 시스템에 대한 경험과 이해의 깊이에 따라 때로는 분명하지 않습니다.
여기서 설명하고 싶은 것은 "스위치 스위칭 상태"와 "일반 국가 판단"사이에 몇 가지 차이가 있다는 것입니다.
코드 사본은 다음과 같습니다.
if (who == 1) state = "Hello";
else if (who == 2) state = "hi";
else if (who == 3) state = "bye";
이것은 "일반적인 국가 판단"입니다. 상태 값의 차이는 어떤 변수와 관련이 없습니다. 변경된 경우 :
코드 사본은 다음과 같습니다.
if (state.euqals ( "bye")) state = "Hello";
else if (state.euqals ( "hello")) state = "hi";
else if (state.euqals ( "hi")) state = "bye";
이것은 "hello"에서 "hi"로 상태를 전환 한 다음 "Hello"로 전환하는 "스위치 스위칭 상태"입니다. 상태가 변경 될 수 있습니다. 상태 모드가 사용됩니다.
"hello"-> "hi"-> "bye"-> "hello"방향을 간단히 전환하는 경우, 상태 모드가 많은 것을 생성하기 때문에 반드시 상태 모드를 사용할 필요는 없습니다. 서브 클래스. 복잡성이지만 다른 동작이 발생하는 경우 : 위의 스위칭 방향을 뒤집거나 마음대로 전환 해야하는 경우 상태가 필요합니다.
다음 예를 참조하십시오.
코드 사본은 다음과 같습니다.
공공 수업 컨텍스트 {
개인 색상 상태 = null;
public void push () {
// 현재 빨간색 상태가 파란색으로 전환되는 경우
if (state == color.red) state = color.blue;
// 현재 파란색 상태가 녹색으로 전환되는 경우
else if (state == color.blue) state = color.green;
// 현재 검은 상태가 빨간색으로 전환되는 경우
else if (state == color.black) state = color.red;
// 현재 녹색 상태가 검은 색으로 전환되는 경우
else if (state == color.green) state = color.black;
샘플 샘플 = 새로운 샘플 (상태);
Sample.operate ();
}
public void pull () {
// 푸시 상태 스위칭의 반대입니다.
else if (state == color.black) state = color.green;
else if (state == color.blue) state = color.red;
else if (state == color.red) state = color.black;
샘플 2 = 새로운 샘플 2 (상태);
sample2.operate ();
}
}
위의 예에서는이 두 가지 스위치 작업이 컨텍스트 색상을 변경해야합니다.
또한, 위의 예에서는 단순한 색상 할당이 매우 간단합니다. 패턴 패턴으로 사용하면 서브 클래스의 수가 증가하여 간단하고 복잡합니다.
예를 들어, 은행 계좌는 종종 개방 상태와 닫기 상태 사이를 전환합니다.
예를 들어, 클래식 TCPConnection에는 TCP 상태에는 3 개의 상태가 있습니다. 청취 마감 및 반복적 인 전환은 한두 문장으로 만 완료 할 수 없으며 상태를 사용하는 데 적합합니다.
예를 들어, 사서함 팝 계정에는 4 개의 상태가 있으며, 시작 HATESERNAME AULHTIRINE QUIT, 각 상태의 해당 동작은 비교적 커서 상태를 사용하는 데 적합해야합니다.
예를 들어 : 도구 상자에서 다른 도구를 선택하는 것은 상태를 사용하는 데 적합한 다른 도구들 사이를 전환하는 것으로 간주 될 수 있습니다. 예를 들어, 특정 드로잉 프로그램이있는 경우 사용자는 상자를 직선 곡선을 그리는 다른 도구를 선택할 수 있습니다.
상태 모드를 사용하는 방법
상태는 두 가지 유형의 엔티티가 참여해야합니다.
1. 상태 관리자는 예를 들어, 위의 컨텍스트는 상태 관리자입니다.
2. 추상 클래스 또는 인터페이스에 의해 구현 된 부모 클래스, 다른 상태는이 부모 클래스의 다른 서브 클래스를 상속합니다.
위의 컨텍스트를 예를 들어, 우리는이를 수정하고 두 가지 유형의 엔티티를 만들고자합니다.
첫 번째 단계는 부모 수업을 만드는 것입니다.
코드 사본은 다음과 같습니다.
공개 초록 클래스 상태 {
공개 초록 void handlepush (컨텍스트 C);
공개 초록 void handlepull (컨텍스트 C);
공개 초록 void getColor ();
}
부모 클래스의 방법은 상태 관리자의 스위치 동작에 해당해야합니다.이 예제는 컨텍스트에 있습니다 handlepush () handlepull ()도 푸시 또는 당기기를 얻는 메소드가 필요합니다.
다음은 특정 서브 클래스의 구현입니다.
코드 사본은 다음과 같습니다.
공공 계급 Bluestate는 상태를 확장합니다.
public void handlepush (컨텍스트 c) {
// 푸시 방법에 따라 "파란색 인 경우 녹색으로 전환하십시오";
C. 세트 스테이트 (New Greenstate ());
}
공개 void handlepull (컨텍스트 C) {
// 풀 메소드에 따르면 "파란색 인 경우 빨간색으로 전환하십시오";
C. 세트 스테이트 (New Redstate ());
}
공개 초록 void getColor () {return (color.blue)}
}
마찬가지로, 다른 상태의 서브 클래스는 파란색으로 구현됩니다.
두 번째 단계는이 예제의 맥락 인 주 관리자를 다시 작성하는 것입니다.
코드 사본은 다음과 같습니다.
ublic 클래스 컨텍스트 {
Private Sate State = NULL; // 원래 색상 상태를 새로 생성 된 상태로 변경했습니다.
// setstate는 setstate를 사용하여 상태를 변경하여 상태 스위칭을 달성하는 데 사용됩니다.
Pulic void setstate (State State) {
this.state = state;
}
public void push () {
// 상태 스위칭의 세부 사항은이 경우 서브 클래스의 핸들 푸시에 캡슐화 된 색상 변경이며 State.HandlePush (this)에 관심이 필요하지 않습니다.
// 샘플은 상태에서 스위칭 결과를 사용해야하므로 getColor ()를 사용하십시오.
샘플 샘플 = 새로운 샘플 (state.getColor ());
Sample.operate ();
}
public void pull () {
state.handlepull (this);
샘플 2 = 새로운 샘플 2 (state.getColor ());
sample2.operate ();
}
}
이 시점에서 우리는 상태의 리팩토링 프로세스를 구현했습니다.
위의 것은 매우 간단한 예제입니다.