memperkenalkan
Mode status memungkinkan suatu objek untuk mengubah perilakunya ketika keadaan internalnya berubah, dan objek tampaknya memodifikasi kelasnya.
teks
Misalnya, ketika kami mengunduh hal -hal, kami biasanya memiliki beberapa negara bagian, seperti ReadyState, DownloadingState, ProusedState, Unduh, DownloadState, dan FailState. Dengan kata lain, di setiap negara bagian, Anda hanya dapat melakukan apa yang dapat dilakukan oleh keadaan saat ini, tetapi tidak apa yang dapat dilakukan oleh negara bagian lain.
Karena pola negara menjelaskan bagaimana unduhan (unduhan) berperilaku berbeda di setiap negara bagian. Gagasan kunci dari pola ini adalah memperkenalkan kelas abstrak yang disebut status (atau fungsi dalam JS) untuk mewakili status pengunduhan. Fungsi keadaan (sebagai prototipe) menyatakan beberapa antarmuka umum untuk subkelas (fungsi pewarisan) dari setiap negara. Setiap fungsi warisan mengimplementasikan perilaku yang terkait dengan keadaan tertentu, seperti DownloadingState dan Unduh masing -masing mengimplementasikan perilaku yang diunduh dan diunduh. Perilaku ini dapat dipertahankan melalui unduhan.
Mari kita terapkan permainan, pertama -tama tentukan fungsi negara sebagai prototipe fungsi dasar lainnya:
Salinan kode adalah sebagai berikut:
var state = function () {
};
State.prototype.download = function () {
Lempar kesalahan baru ("Metode ini harus kelebihan beban!");
};
State.prototype.pause = function () {
Lempar kesalahan baru ("Metode ini harus kelebihan beban!");
};
State.prototype.fail = function () {
Lempar kesalahan baru ("Metode ini harus kelebihan beban!");
};
State.prototype.finish = function () {
Lempar kesalahan baru ("Metode ini harus kelebihan beban!");
};
Kami mendefinisikan 4 antarmuka metode untuk prototipe status, yang sesuai dengan unduhan (unduhan), jeda, kegagalan, dan akhir sehingga subfungsi dapat ditulis ulang.
Sebelum menulis subfungsi, pertama -tama kami menulis fungsi ReadyState sehingga keadaan dapat diteruskan ke status unduhan pertama:
Salinan kode adalah sebagai berikut:
var readystate = function (odownload) {
State.Apply (ini);
this.odownload = odownload;
};
ReadyState.prototype = state baru ();
Readystate.prototype.download = function () {
this.odownload.setState (this.odownload.getDownloadingState ());
// Setelah siap, Anda dapat mulai mengunduh, jadi Anda mengatur metode akuisisi negara bagian dalam fungsi unduhan
Console.log ("Mulai Unduh!");
};
ReadyState.Prototype.Pause = function () {
Lempar kesalahan baru ("Unduh belum dimulai, tidak dapat dijeda!");
};
Readystate.prototype.fail = function () {
Lempar kesalahan baru ("File belum mulai mengunduh, bagaimana bisa dikatakan bahwa itu telah gagal!");
};
Readystate.prototype.finish = function () {
Lempar kesalahan baru ("File belum mulai mengunduh, tentu saja tidak dapat diselesaikan!");
};
Fungsi ini mengambil contoh fungsi pemeliharaan unduhan sebagai parameter. Fungsi unduhan digunakan untuk mengontrol perubahan status dan akuisisi (mirip dengan pengontrol pusat, memungkinkan panggilan eksternal). ReadyState menulis ulang metode unduhan prototipe untuk mulai mengunduh. Mari kita terus melihat fungsi utama fungsi unduhan:
Salinan kode adalah sebagai berikut:
var download = function () {
this.ostate = new ReadyState (this);
};
Download.prototype.setState = function (ostate) {
this.ostate = ostate;
};
// Empat metode publik yang terpapar ke luar untuk panggilan eksternal
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 ();
};
// Dapatkan berbagai negara bagian dan lulus dalam objek ini saat ini
Download.prototype.getreadystate = function () {
Return New ReadyState (ini);
};
Download.prototype.getDownloadingState = function () {
return new downloadState (ini);
};
Download.prototype.getDownloadPausedState = function () {
Return New DownloadPaUsedState (ini);
};
Download.prototype.getDownloadedState = function () {
return new downloadState (ini);
};
Download.prototype.getDownloadedFailedState = function () {
Return New DownloadFailedState (ini);
};
Prototipe fungsi unduhan menyediakan 8 metode, 4 adalah perilaku operasional untuk mengunduh status, dan 4 lainnya digunakan untuk mendapatkan empat status yang berbeda saat ini. Keempat metode ini semua menerima ini sebagai parameter, yaitu, lulus instance unduhan itu sendiri sebagai parameter ke objek negara (ReadyState dan fungsi pewarisan yang akan diimplementasikan nanti), yang membuat objek negara dapat diakses oleh ODOWNLAOD daripada jika perlu.
Selanjutnya, terus mendefinisikan 4 fungsi negara terkait:
Salinan kode adalah sebagai berikut:
var downloadingstate = function (odownload) {
State.Apply (ini);
this.odownload = odownload;
};
Downloadingstate.prototype = state baru ();
Downloadingstate.prototype.download = function () {
Lempar kesalahan baru ("File sudah mengunduh!");
};
Downloadingstate.prototype.pause = function () {this.odownload.setState (this.odownload.getDownLoadPaSeUseState ());
console.log ("PAUSE Download!");
};
Downloadingstate.prototype.fail = function () {this.odownload.setState (this.odownload.getDownloadedFailedState ());
Console.log ("Unduh Gagal!");
};
Downloadingstate.prototype.finish = function () {
this.odownload.setState (this.odownload.getDownloadedState ());
Console.log ("Diunduh!");
};
Hal utama yang perlu diperhatikan tentang DownloadingState adalah bahwa file yang sudah diunduh tidak dapat diunduh lagi, dan status lain dapat dilakukan secara terus menerus.
Salinan kode adalah sebagai berikut:
var downloadpausedState = function (odownload) {
State.Apply (ini);
this.odownload = odownload;
};
DownloadPausedState.prototype = state baru ();
DownloadPausedState.prototype.download = function () {
this.odownload.setState (this.odownload.getDownloadingState ());
Console.log ("Lanjutkan untuk mengunduh!");
};
DownloadPausedState.prototype.Pause = function () {
Lemparkan kesalahan baru ("Sudah berhenti, mengapa Anda masih harus berhenti!");
};
DownloadPausedState.prototype.fail = function () {this.odownload.setState (this.odownload.getDownLoadedFailedState ());
Console.log ("Unduh Gagal!");
};
DownloadPausedState.prototype.finish = function () {
this.odownload.setState (this.odownload.getDownloadedState ());
Console.log ("Diunduh!");
};
Perlu dicatat dalam fungsi unduh yang disukai yang diunduh yang telah dijeda tidak dapat dijeda lagi.
Salinan kode adalah sebagai berikut:
var downloadedstate = function (odownload) {
State.Apply (ini);
this.odownload = odownload;
};
Downloadedstate.prototype = state baru ();
Downloadedstate.prototype.download = function () {
this.odownload.setState (this.odownload.getDownloadingState ());
Console.log ("Download ulang!");
};
Downloadedstate.prototype.pause = function () {
Lempar kesalahan baru ("Apa lagi yang akan Anda hentikan setelah mengunduh?");
};
Downloadedstate.prototype.fail = function () {
Lempar kesalahan baru ("Unduhan telah berhasil, mengapa gagal?");
};
Downloadedstate.prototype.finish = function () {
Lempar kesalahan baru ("Unduhan berhasil, Anda tidak bisa melakukannya lagi!");
};
Fungsi DownloadState, Demikian pula, setelah unduhan yang berhasil, Anda tidak dapat lagi mengatur selesai, Anda hanya dapat mengatur status unduhan ulang.
Salinan kode adalah sebagai berikut:
var downloadFailedState = function (odownload) {
State.Apply (ini);
this.odownload = odownload;
};
DownloadFailedState.prototype = state baru ();
Downloadfailedstate.prototype.download = function () {
this.odownload.setState (this.odownload.getDownloadingState ());
console.log ("Cobalah untuk mengunduh ulang!");
};
Downloadfailedstate.prototype.pause = function () {
Lempar kesalahan baru ("Unduh yang gagal tidak dapat dijeda!");
};
Downloadfailedstate.prototype.fail = function () {
Lemparkan kesalahan baru ("Semuanya gagal, mengapa masih gagal!");
};
Downloadfailedstate.prototype.finish = function () {
Lempar kesalahan baru ("Unduh yang gagal pasti tidak akan berhasil!");
};
Demikian pula, status kegagalan fungsi unduhan failedState tidak dapat gagal lagi, tetapi Anda dapat mencoba mengunduhnya lagi setelah selesai.
Memanggil kode tes sangat sederhana. Mari kita tunjukkan di HTML. Pertama, Anda membutuhkan jQuery, dan kemudian ada 3 tombol yang mewakili: Mulai Unduh, Pause, dan Download ulang. (Perhatikan bahwa Anda menggunakan Firebug untuk melihat hasilnya di Firefox, karena metode Console.log digunakan).
Salinan kode adalah sebagai berikut:
<Html>
<head>
<tautan type = "text/css" rel = "stylesheet" href = "http://www.cnblogs.com/css/style.css"/>
<title> Pola Negara </iteme>
<type skrip = "Text/JavaScript" src = "/jQuery.js"> </script>
<script type = "text/javaScript" src = "download.js"> </script>
<type script = "Text/JavaScript" src = "state/state.js"> </script>
<script type = "text/javascript" src = "state/downloadfailedState.js"> </script>
<script type = "text/javaScript" src = "state/downloadpausedState.js"> </script>
<type skrip = "Text/JavaScript" src = "state/downloadedstate.js"> </script>
<type script = "Text/JavaScript" src = "state/downloadState.js"> </script>
<script type = "text/javascript" src = "state/readystate.js"> </script>
</head>
<body>
<input type = "tombol" value = "Mulai unduh" id = "download_button" />
<input type = "Tombol" value = "jeda" id = "pause_button" />
<input type = "tombol" value = "re-download" id = "resume_button" />
<type skrip = "Teks/JavaScript">
var odownload = download baru ();
$ ("#download_button"). Klik (fungsi () {
odownload.download ();
});
$ ("#Pause_button"). Klik (function () {
odownload.pause ();
});
$ ("#resume_button"). Klik (fungsi () {
odownload.download ();
});
</script>
</body>
</html>
Meringkaskan
Skenario penggunaan mode status juga sangat jelas, dengan dua poin berikut:
1. Perilaku suatu objek tergantung pada keadaannya, dan ia harus mengubah perilakunya sesuai dengan keadaannya pada waktu berjalan.
2. Suatu operasi berisi sejumlah besar pernyataan cabang, dan pernyataan cabang ini tergantung pada keadaan objek. Negara biasanya merupakan representasi dari satu atau lebih konstanta enumerasi.