แนะนำ
โหมดสถานะอนุญาตให้วัตถุเปลี่ยนพฤติกรรมเมื่อสถานะภายในเปลี่ยนแปลงและวัตถุจะปรากฏขึ้นเพื่อปรับเปลี่ยนคลาส
ข้อความ
ตัวอย่างเช่นเมื่อเราดาวน์โหลดสิ่งต่าง ๆ เรามักจะมีหลายรัฐเช่น ReadyState, DownloadingState, PausedState, DowndoedState, DowndEdState และ 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.odownload = odownload;
-
ReadyState.prototype = สถานะใหม่ ();
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 (นี่);
-
download.prototype.setState = function (ostate) {
this.ostate = ostate;
-
// สี่วิธีสาธารณะที่สัมผัสกับภายนอกสำหรับการโทรภายนอก
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 (นี่);
-
download.prototype.getDownloadingState = function () {
ส่งคืน DownloadingState ใหม่ (นี่);
-
download.prototype.getdownloadpausedstate = function () {
ส่งคืน DownloadPausedState ใหม่ (นี่);
-
download.prototype.getDownloadEdState = function () {
ส่งคืน DownloadedState ใหม่ (นี่);
-
download.prototype.getDownloadedFailedState = function () {
ส่งคืนดาวน์โหลด FailedState ใหม่ (นี่);
-
ต้นแบบของฟังก์ชั่นการดาวน์โหลดมี 8 วิธี 4 เป็นพฤติกรรมการดำเนินงานสำหรับการดาวน์โหลดสถานะและอีก 4 ใช้เพื่อให้ได้สถานะที่แตกต่างกันสี่สถานะในปัจจุบัน 4 วิธีเหล่านี้ทั้งหมดได้รับสิ่งนี้เป็นพารามิเตอร์นั่นคือผ่านอินสแตนซ์ดาวน์โหลดเองเป็นพารามิเตอร์ไปยังวัตถุสถานะ (ReadyState และฟังก์ชั่นการสืบทอดที่จะนำไปใช้ในภายหลัง) ซึ่งทำให้วัตถุสถานะสามารถเข้าถึง OdownLaod ได้มากกว่าที่จำเป็น
จากนั้นดำเนินการต่อเพื่อกำหนด 4 ฟังก์ชั่นสถานะที่เกี่ยวข้อง:
การคัดลอกรหัสมีดังนี้:
var downloadingState = function (odownload) {
state.apply (นี้);
this.odownload = odownload;
-
downloadingState.prototype = สถานะใหม่ ();
downloadingState.prototype.download = function () {
โยนข้อผิดพลาดใหม่ ("ไฟล์กำลังดาวน์โหลดอยู่แล้ว!");
-
downloadingState.prototype.pause = function () {this.odownload.setState (this.odownload.getDownloadPausedState ());
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 ("ดาวน์โหลด!");
-
สิ่งสำคัญที่ควรทราบเกี่ยวกับการดาวน์โหลด state คือไฟล์ที่ดาวน์โหลดอยู่แล้วไม่สามารถดาวน์โหลดได้อีกครั้งและสถานะอื่น ๆ สามารถดำเนินการได้อย่างต่อเนื่อง
การคัดลอกรหัสมีดังนี้:
var downloadpausedstate = function (odownload) {
state.apply (นี้);
this.odownload = odownload;
-
downloadpausedstate.prototype = ใหม่ 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 ("ดาวน์โหลด!");
-
ควรสังเกตในฟังก์ชั่น DownloadPausedState ที่ดาวน์โหลดที่หยุดชั่วคราวไม่สามารถหยุดชั่วคราวได้อีกครั้ง
การคัดลอกรหัสมีดังนี้:
var downloadedState = function (odownload) {
state.apply (นี้);
this.odownload = odownload;
-
downloadedState.prototype = สถานะใหม่ ();
downloadedState.prototype.download = function () {
this.odownload.setState (this.odownload.getDownloadingState ());
console.log ("ดาวน์โหลดอีกครั้ง!");
-
downloadedState.prototype.pause = function () {
โยนข้อผิดพลาดใหม่ ("คุณจะหยุดอะไรอีกหลังจากดาวน์โหลด");
-
downloadedState.prototype.fail = function () {
โยนข้อผิดพลาดใหม่ ("การดาวน์โหลดประสบความสำเร็จทำไมมันถึงล้มเหลว");
-
downloadedState.prototype.finish = function () {
โยนข้อผิดพลาดใหม่ ("การดาวน์โหลดสำเร็จคุณไม่สามารถทำได้อีกต่อไป!");
-
ฟังก์ชั่นดาวน์โหลด State ในทำนองเดียวกันหลังจากการดาวน์โหลดที่ประสบความสำเร็จคุณไม่สามารถตั้งค่าเสร็จได้อีกต่อไปคุณสามารถตั้งค่าสถานะการโหลดอีกครั้งเท่านั้น
การคัดลอกรหัสมีดังนี้:
var downloadfailedState = function (odownload) {
state.apply (นี้);
this.odownload = odownload;
-
downloadfailedstate.prototype = สถานะใหม่ ();
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 เพื่อดูผลลัพธ์ใน Firefox เนื่องจากใช้วิธี console.log)
การคัดลอกรหัสมีดังนี้:
<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 = "state/state.js"> </script>
<script type = "text/javascript" src = "state/downloadfailedstate.js"> </script>
<script type = "text/javascript" src = "state/downloadpausedstate.js"> </script>
<script type = "text/javascript" src = "state/downloadedstate.js"> </script>
<script type = "text/javascript" src = "state/downloadingstate.js"> </script>
<script type = "text/javascript" src = "readystate.js"> </script>
</head>
<body>
<อินพุต type = "button" value = "เริ่มดาวน์โหลด" id = "download_button" />>>
<อินพุต type = "button" value = "pause" id = "pause_button" />>>
<อินพุต type = "button" value = "re-download" id = "resume_button" />>>> >>
<script type = "text/javascript">
var odownload = ใหม่ดาวน์โหลด ();
$ ("#download_button") คลิก (ฟังก์ชัน () {
odownload.download ();
-
$ ("#pause_button") คลิก (ฟังก์ชัน () {
odownload.pause ();
-
$ ("#resume_button") คลิก (ฟังก์ชัน () {
odownload.download ();
-
</script>
</body>
</html>
สรุป
สถานการณ์การใช้งานของโหมดสถานะก็ชัดเจนเป็นพิเศษด้วยสองจุดต่อไปนี้:
1. พฤติกรรมของวัตถุขึ้นอยู่กับสถานะของมันและจะต้องเปลี่ยนพฤติกรรมตามสถานะของมันในเวลาทำงาน
2. การดำเนินการมีงบสาขาจำนวนมากและงบสาขาเหล่านี้ขึ้นอยู่กับสถานะของวัตถุ รัฐมักจะเป็นตัวแทนของค่าคงที่การแจงนับหนึ่งหรือมากกว่า