소개하다
상태 모드를 사용하면 내부 상태가 변경 될 때 객체가 동작을 변경할 수 있으며 객체가 클래스를 수정하는 것으로 보입니다.
텍스트
예를 들어, 물건을 다운로드 할 때 일반적으로 ReadyState, DownloadingState, PASUSSSTATE, DownloadedState, DownloadedState 및 FailedState와 같은 여러 주가 있습니다. 즉, 각 주에서는 현재 상태가 할 수있는 일만 할 수 있지만 다른 상태가 할 수있는 일은 아닙니다.
상태 패턴은 다운로드 (다운로드)가 각 상태에서 어떻게 다르게 행동하는지 설명하기 때문입니다. 이 패턴의 핵심 아이디어는 다운로드 상태를 나타 내기 위해 State (또는 JS의 함수)라는 추상 클래스를 소개하는 것입니다. 상태 함수 (프로토 타입으로)는 각 상태의 서브 클래스 (상속 함수)에 대한 공통 인터페이스를 선언합니다. 각 상속 기능은 다운로드 스테이트 및 다운로드 스타트와 같은 특정 상태와 관련된 동작을 구현합니다. 이러한 행동은 다운로드를 통해 유지할 수 있습니다.
게임을 구현하고 먼저 상태 기능을 다른 기본 기능의 프로토 타입으로 정의합니다.
코드 사본은 다음과 같습니다.
var state = function () {
};
state.prototype.download = function () {
새 오류를 던지십시오 ( "이 방법은 과부하가되어야합니다!");
};
state.prototype.pause = function () {
새 오류를 던지십시오 ( "이 방법은 과부하가되어야합니다!");
};
state.prototype.fail = function () {
새 오류를 던지십시오 ( "이 방법은 과부하가되어야합니다!");
};
state.prototype.finish = function () {
새 오류를 던지십시오 ( "이 방법은 과부하가되어야합니다!");
};
스테이트 프로토 타입에 대한 4 개의 메소드 인터페이스를 정의합니다. 스테이트 프로토 타입에 대한 다운로드 (다운로드), 일시 정지, 실패 및 종료에 해당하여 하위 기능을 다시 작성할 수 있습니다.
하위 기능을 작성하기 전에 먼저 준비 상태 기능을 작성하여 상태를 첫 번째 다운로드 상태로 전달할 수 있습니다.
코드 사본은 다음과 같습니다.
var readystate = function (odownload) {
State.Apply (this);
this.odownload = odownload;
};
readystate.prototype = new State ();
readystate.prototype.download = function () {
this.odownload.setstate (this.odownload.getDownLoadingState ());
// 준비 후 다운로드를 시작할 수 있으므로 다운로드 기능에서 상태 획득 방법을 설정합니다.
Console.log ( "시작 다운로드!");
};
readystate.prototype.pause = function () {
새로운 오류 ( "다운로드는 아직 시작되지 않았으며 일시 정지 될 수 없습니다!");
};
readystate.prototype.fail = function () {
새로운 오류 ( "파일은 아직 다운로드가 시작되지 않았으며 실패했다고 어떻게 말할 수 있습니까!");
};
readystate.prototype.finish = function () {
새 오류를 던지십시오 ( "파일이 다운로드가 시작되지 않았습니다. 물론 완료 할 수 없습니다!");
};
이 기능은 다운로드 유지 관리 기능의 인스턴스를 매개 변수로 사용합니다. 다운로드 기능은 상태 변경 및 획득을 제어하는 데 사용됩니다 (중앙 컨트롤러와 유사하여 외부 호출이 가능함). ReadyState는 프로토 타입 다운로드 방법을 다시 작성하여 다운로드를 시작합니다. 다운로드 기능의 주요 기능을 계속 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
var download = function () {
this.ostate = new ReadyState (this);
};
download.prototype.setstate = function (ostate) {
this.ostate = ostate;
};
// 외부 통화를 위해 외부에 노출 된 4 가지 공개 방법
다운로드 .prototype.download = function () {
this.ostate.download ();
};
다운로드 .prototype.pause = function () {
this.ostate.pause ();
};
다운로드 .prototype.fail = function () {
this.ostate.fail ();
};
다운로드 .prototype.finish = function () {
this.ostate.finish ();
};
// 다양한 상태를 얻고 현재이 개체를 전달합니다.
다운로드 .prototype.getReadyState = function () {
새로운 ReadyState (this)를 반환합니다.
};
다운로드 .prototype.getDownloadingState = function () {
새로운 DownloadingState (this)를 반환합니다.
};
다운로드 .prototype.getDownloadPausedState = function () {
새로운 DownloadPausedState (this)를 반환합니다.
};
다운로드 .prototype.getDownloadedState = function () {
새로운 다운로드 스타이트 (this)를 반환합니다.
};
download.prototype.getDownLoadEdFailedState = function () {
새로운 DownloadFailedState (this)를 반환합니다.
};
다운로드 함수의 프로토 타입은 8 가지 방법을 제공하고 4는 상태를 다운로드하기위한 운영 행동이며, 다른 4 개는 현재 4 개의 다른 상태를 얻는 데 사용됩니다. 이 4 가지 방법은 모두이를 매개 변수로 수신합니다. 즉, 다운로드 인스턴스 자체를 State Object (ReadyState 및 나중에 구현할 상속 함수)로 다운로드 인스턴스 자체로 전달하여 상태 객체를 필요한 경우보다 OdownLaod에 액세스 할 수 있습니다.
다음으로 4 개의 관련 상태 기능을 계속 정의하십시오.
코드 사본은 다음과 같습니다.
var downloadingstate = function (odownload) {
State.Apply (this);
this.odownload = odownload;
};
DownloadingState.prototype = new State ();
DownloadingState.Prototype.Download = function () {
새 오류를 던지십시오 ( "파일이 이미 다운로드 중입니다!");
};
DownloadingState.prototype.pause = function () {this.odownload.setstate (this.odownload.getDownLoadPauidState ());
console.log ( "일시 정지 다운로드!");
};
DownloadingState.prototype.fail = function () {this.odownload.setstate (this.odownload.getDownloadedFailedState ());
Console.log ( "다운로드 실패!");
};
DownloadingState.prototype.finish = function () {
this.odownload.setstate (this.odownload.getDownloadedState ());
Console.log ( "다운로드!");
};
DownloadingState에 대해 주목해야 할 주요 사항은 이미 다운로드중인 파일을 다시 다운로드 할 수 없으며 다른 상태를 지속적으로 수행 할 수 있다는 것입니다.
코드 사본은 다음과 같습니다.
var downloadPausedState = function (odownload) {
State.Apply (this);
this.odownload = odownload;
};
downloadpausedstate.prototype = new State ();
downloadpausedstate.prototype.download = function () {
this.odownload.setstate (this.odownload.getDownLoadingState ());
Console.log ( "계속 다운로드!");
};
downloadpausedstate.prototype.pause = function () {
새로운 오류를 던지십시오 ( "그것은 잠시 멈췄습니다. 왜 여전히 일시 중지해야합니까!");
};
downloadpausedstate.prototype.fail = function () {this.odownload.setstate (this.odownload.getDownLoadEdFailedState ());
Console.log ( "다운로드 실패!");
};
downloadpausedstate.prototype.finish = function () {
this.odownload.setstate (this.odownload.getDownloadedState ());
Console.log ( "다운로드!");
};
멈춘 다운로드가 다시 일시 정지 될 수 없다는 다운로드 PausedState 함수에서 언급되어야합니다.
코드 사본은 다음과 같습니다.
var downloadedState = function (odownload) {
State.Apply (this);
this.odownload = odownload;
};
DownloadedState.prototype = new State ();
DownloadedState.Prototype.Download = function () {
this.odownload.setstate (this.odownload.getDownLoadingState ());
console.log ( "re-download!");
};
downloadedState.prototype.Pause = function () {
새로운 오류를 던지십시오 ( "다운로드 후 무엇을 잠시 멈출 것인가?");
};
downloadedstate.prototype.fail = function () {
Throw New 오류 ( "다운로드가 성공적으로, 왜 실패합니까?");
};
DownloadedState.prototype.finish = function () {
새로운 오류 ( "다운로드가 성공적이면 더 이상 할 수 없습니다!");
};
다운로드 된 상태 기능, 마찬가지로 성공적인 다운로드 후 마찬가지로 더 이상 마무리를 설정할 수 없으므로 다시 다운로드 상태 만 설정할 수 있습니다.
코드 사본은 다음과 같습니다.
var downloadfailedstate = function (odownload) {
State.Apply (this);
this.odownload = odownload;
};
downloadfailedstate.prototype = new State ();
downloadfailedstate.prototype.download = function () {
this.odownload.setstate (this.odownload.getDownLoadingState ());
Console.log ( "다시 다운로드를 시도하십시오!");
};
downloadfailedstate.prototype.pause = function () {
새 오류를 던지십시오 ( "실패한 다운로드가 일시 중지 될 수 없습니다!");
};
downloadfailedstate.prototype.fail = function () {
새로운 오류를 던지십시오 ( "모두 실패했습니다. 왜 여전히 실패 했습니까!");
};
downloadfailedstate.prototype.finish = function () {
새 오류를 던지십시오 ( "실패한 다운로드는 확실히 성공하지 못할 것입니다!");
};
마찬가지로 DownloadFailedState 함수의 실패 상태는 다시 실패 할 수 없지만 완료 후 다시 다운로드하려고 시도 할 수 있습니다.
테스트 코드를 호출하는 것은 매우 간단합니다. HTML에서 시연합시다. 먼저 jQuery가 필요하고 다운로드 시작, 일시 중지 및 다시 다운로드를 나타내는 3 개의 버튼이 있습니다. (Console.Log 메소드가 사용되므로 FireBug를 사용하여 Firefox에서 결과를보십시오).
코드 사본은 다음과 같습니다.
<html>
<헤드>
<link type = "text/css"rel = "스타일 시트"href = "http://www.cnblogs.com/css/style.css"/>
<title> 상태 패턴 </title>
<script type = "text/javaScript"src = "/jquery.js"> </script>
<script type = "text/javaScript"src = "download.js"> </script>
<script type = "text/javaScript"src = "states/state.js"> </script>
<script type = "text/javaScript"src = "states/downloadfailedstate.js"> </script>
<script type = "text/javaScript"src = "states/downloadPausedState.js"> </script>
<script type = "text/javaScript"src = "states/downloadedState.js"> </script>
<script type = "text/javaScript"src = "states/downloadingstate.js"> </script>
<script type = "text/javaScript"src = "states/readystate.js"> </script>
</head>
<body>
<입력 유형 = "버튼"value = "시작 다운로드"id = "download_button" />
<입력 유형 = "버튼"value = "pause"id = "pause_button" />
<input type = "button"value = "re-download"id = "resume_button" />
<script type = "text/javaScript">
var odownload = 새로운 다운로드 ();
$ ( "#download_button"). 클릭 (function () {
odownload.download ();
});
$ ( "#pause_button"). 클릭 (function () {
odownload.pause ();
});
$ ( "#recume_button"). 클릭 (function () {
odownload.download ();
});
</스크립트>
</body>
</html>
요약
상태 모드의 사용 시나리오는 특히 다음 두 가지 점으로 명확합니다.
1. 객체의 동작은 상태에 따라 달라지며, 실행 시간에 상태에 따라 동작을 바꿔야합니다.
2. 조작에는 다수의 분기 문이 포함되어 있으며,이 분기 문은 객체의 상태에 따라 다릅니다. 상태는 일반적으로 하나 이상의 열거 상수의 표현입니다.