導入
状態モードにより、オブジェクトは内部状態が変更されたときに動作を変更でき、オブジェクトはクラスを変更するように見えます。
文章
たとえば、物事をダウンロードすると、通常、ReadyState、DownloadingState、PausedState、DownloadEdState、DownloadEdState、FailEdStateなど、いくつかの状態があります。つまり、各州では、現在の状態ができることのみを行うことができますが、他の州でできることはありません。
状態パターンは、各状態でダウンロード(ダウンロード)がどのように異なる動作をするかを説明しているためです。このパターンの重要なアイデアは、ダウンロード状態を表すために状態(またはJSの関数)と呼ばれる抽象クラスを導入することです。状態関数(プロトタイプとして)は、各状態のサブクラス(相続関数)のいくつかの一般的なインターフェイスを宣言します。各継承関数は、ダウンロード型やダウンロード型など、特定の状態に関連する動作をそれぞれ実装し、それぞれダウンロードおよびダウンロードされている動作を実装します。これらの動作は、ダウンロードを通じて維持できます。
ゲームを実装し、まず状態関数を他の基本機能のプロトタイプとして定義しましょう。
コードコピーは次のとおりです。
var state = function(){
};
state.prototype.download = function(){
新しいエラーをスローします(「この方法は過負荷にする必要があります!」);
};
state.prototype.pause = function(){
新しいエラーをスローします(「この方法は過負荷にする必要があります!」);
};
state.prototype.fail = function(){
新しいエラーをスローします(「この方法は過負荷にする必要があります!」);
};
state.prototype.finish = function(){
新しいエラーをスローします(「この方法は過負荷にする必要があります!」);
};
状態のプロトタイプの4つのメソッドインターフェイスを定義します。これは、ダウンロード(ダウンロード)、一時停止、障害、および終了に対応して、サブ機能を書き直すことができます。
サブ機能を記述する前に、最初にReadyState関数を書き、状態を最初のダウンロード状態に渡すことができます。
コードコピーは次のとおりです。
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つのパブリック方法
download.prototype.download = function(){
this.ostate.download();
};
download.prototype.pause = function(){
this.ostate.pause();
};
download.prototype.fail = function(){
this.ostate.fail();
};
download.prototype.finish = function(){
this.ostate.finish();
};
//さまざまな状態を取得し、現在のこのオブジェクトを渡す
download.prototype.getReadyState = function(){
新しいReadyState(this)を返します。
};
download.prototype.getDownLoadingState = function(){
new downloadingState(this)を返します。
};
download.prototype.getDownLoadPausedState = function(){
new downloadpausedState(this)を返します。
};
download.prototype.getDownLoadEdState = function(){
new downloadedState(this)を返します。
};
download.prototype.getDownLoadedFailedState = function(){
新しいdownloadfailedState(this)を返します。
};
ダウンロード関数のプロトタイプは8つの方法を提供し、4つは状態をダウンロードするための動作動作であり、他の4つは現在の4つの異なる状態を取得するために使用されます。これらの4つのメソッドはすべてこれをパラメーターとして受信します。つまり、ダウンロードインスタンス自体を状態オブジェクト(後で実装するReadyStateおよび継承関数)へのパラメーターとして渡されます。
次に、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.getDownLoadPausedState());
console.log( "Pause download!");
};
downloadingState.prototype.fail = function(){this.odownload.setState(this.odownload.getDownLoadedFailedState());
console.log( "ダウンロードFailed!");
};
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( "ダウンロードFailed!");
};
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(){
新しいエラーをスローします(「ダウンロードは成功しました、なぜ失敗するのですか?」);
};
downloadedstate.prototype.finish = function(){
新しいエラーをスローします(「ダウンロードは成功しました、もうそれはできません!」);
};
DownloadEdState関数同様に、ダウンロードが成功した後、完了を設定できなくなり、再ダウンロードステータスのみを設定できます。
コードコピーは次のとおりです。
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つのボタンがあります。 (firebugを使用して、console.logメソッドが使用されているため、結果をFirefoxで表示することに注意してください)。
コードコピーは次のとおりです。
<html>
<head>
<link type = "text/css" rel = "styleSheet" 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"> </scrip>
<script type = "text/javascript" src = "states/downloadfailedstate.js"> </scrip>
<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>
<入力型= "ボタン"値= "ダウンロードを開始" id = "download_button" />
<入力型= "button" value = "Pause" id = "pause_button" />
<入力型= "button" value = "re-download" id = "resume_button" />
<script type = "text/javascript">
var odownload = new download();
$( "#download_button")。クリック(function(){
odownload.download();
});
$( "#pause_button")。クリック(function(){
odownload.pause();
});
$( "#resume_button")。クリック(function(){
odownload.download();
});
</script>
</body>
</html>
要約します
ステータスモードの使用シナリオも特に明確で、次の2つのポイントがあります。
1.オブジェクトの動作はその状態に依存し、実行時にその状態に応じてその動作を変更する必要があります。
2.操作には多数のブランチステートメントが含まれており、これらのブランチステートメントはオブジェクトの状態に依存します。状態は通常、1つ以上の列挙定数の表現です。