คำจำกัดความของรัฐ: สถานะที่แตกต่างกันพฤติกรรมที่แตกต่างกันหรือกล่าวอีกนัยหนึ่งแต่ละรัฐมีพฤติกรรมที่สอดคล้องกัน
เมื่อใดควรใช้โหมดสถานะ
โหมดสถานะมักใช้ในการใช้งานจริงและเหมาะสำหรับ "การสลับสถานะ" เนื่องจากเรามักจะใช้ถ้าอื่นถ้าอื่นเพื่อเปลี่ยนสถานะหากการตัดสินของรัฐนี้ซ้ำเราต้องคิดว่าเราสามารถใช้โหมดรัฐได้หรือไม่
ไม่เพียง แต่ขึ้นอยู่กับสถานะ แต่ยังอยู่ในแอตทริบิวต์ หากคุณสมบัติของวัตถุแตกต่างกันพฤติกรรมของวัตถุนั้นแตกต่างกัน คุณสมบัติการเปลี่ยนแปลงดังกล่าว (การสลับ) ของคุณสมบัติอาจเกิดขึ้นได้ตลอดเวลาดังนั้นจึงเป็นไปได้ที่จะใช้สถานะ
ในการใช้งานจริงมีการสลับรัฐจำนวนมากคล้ายกับสวิตช์ แต่บางครั้งก็ไม่ชัดเจนขึ้นอยู่กับประสบการณ์และความเข้าใจในความเข้าใจของระบบ
สิ่งที่เราต้องการอธิบายที่นี่คือมีความแตกต่างระหว่าง "การสลับสถานะสวิตช์" และ "การตัดสินของรัฐทั่วไป"
การคัดลอกรหัสมีดังนี้:
ถ้า (ซึ่ง == 1) state = "สวัสดี";
อื่นถ้า (ซึ่ง == 2) state = "สวัสดี";
อื่นถ้า (ซึ่ง == 3) state = "ลาก่อน";
นี่คือ "การตัดสินของรัฐทั่วไป" หากเปลี่ยนเป็น:
การคัดลอกรหัสมีดังนี้:
ถ้า (state.euqals ("ลาก่อน")) state = "สวัสดี";
อื่นถ้า (state.euqals ("hello")) state = "hi";
อื่นถ้า (state.euqals ("hi")) state = "ลาก่อน";
นี่คือ "สถานะสวิตช์สวิตช์" ซึ่งคือการเปลี่ยนสถานะของสถานะจาก "สวัสดี" เป็น "สวัสดี" จากนั้นไปที่ "ลาก่อน"; สถานะสามารถเปลี่ยนโหมดสถานะได้
หากคุณเพียงแค่เปลี่ยนทิศทาง "สวัสดี"-> "สวัสดี"-> "ลาก่อน"-> "สวัสดี" ในด้านบนคุณไม่จำเป็นต้องใช้โหมดสถานะเนื่องจากโหมดสถานะจะสร้างจำนวนมาก subclasses
โปรดดูตัวอย่างต่อไปนี้:
การคัดลอกรหัสมีดังนี้:
บริบทชั้นเรียนสาธารณะ {
สถานะสีส่วนตัว = null;
โมฆะสาธารณะผลัก () {
// ถ้าสถานะสีแดงปัจจุบันเปลี่ยนเป็นสีน้ำเงิน
if (state == color.red) state = color.blue;
// ถ้าสถานะสีน้ำเงินปัจจุบันเปลี่ยนเป็นสีเขียว
อื่นถ้า (state == color.blue) state = color.green;
// ถ้าสถานะสีดำปัจจุบันเปลี่ยนเป็นสีแดง
อื่นถ้า (state == color.black) state = color.red;
// ถ้าสถานะสีเขียวปัจจุบันเปลี่ยนเป็นสีดำ
อื่นถ้า (state == color.green) state = color.black;
ตัวอย่างตัวอย่าง = ตัวอย่างใหม่ (สถานะ);
sample.operate ();
-
โมฆะสาธารณะดึง () {
// มันเป็นสิ่งที่ตรงกันข้ามกับการสลับสถานะการผลักถ้า (state == color.green) state = color.blue;
อื่นถ้า (state == color.black) state = color.green;
อื่นถ้า (state == color.blue) state = color.red;
อื่นถ้า (state == color.red) state = color.black;
ตัวอย่าง 2 ตัวอย่าง 2 = ตัวอย่างใหม่ 2 (สถานะ);
sample2.operate ();
-
-
ในตัวอย่างข้างต้นเรามีการกระทำสองอย่างผลักดันและดึง
หมายเหตุ: ในตัวอย่างข้างต้นการเปลี่ยนแปลงของรัฐเป็นเพียงการกำหนดสีที่เรียบง่าย ใช้รูปแบบนี้จะเพิ่มจำนวนคลาสย่อยทำให้ง่ายและซับซ้อน
ตัวอย่างเช่น: บัญชีธนาคารมักจะสลับระหว่างสถานะเปิดและสถานะปิด
ตัวอย่างเช่น TCPConnection แบบคลาสสิกสถานะของ TCP มีสามสถานะ: การสร้างการฟังการฟังและการแปลงซ้ำ ๆ
ตัวอย่างเช่น: บัญชี POP Mailbox จะมีสี่สถานะเริ่มต้น HASUSERNAME ที่ได้รับอนุญาตจากการออกจากตำแหน่งพฤติกรรมที่สอดคล้องกันของแต่ละรัฐควรมีขนาดค่อนข้างใหญ่เหมาะสำหรับการใช้สถานะ
ตัวอย่างเช่น: การเลือกเครื่องมือต่าง ๆ ในกล่องเครื่องมือสามารถถือได้ว่าเป็นการสลับระหว่างเครื่องมือที่แตกต่างกันเหมาะสำหรับการใช้สถานะ ตัวอย่างเช่นหากคุณมีโปรแกรมการวาดภาพเฉพาะผู้ใช้สามารถเลือกเครื่องมือต่าง ๆ เพื่อวาดเส้นโค้งตรงกล่อง
วิธีใช้โหมดสถานะ
รัฐต้องการเอนทิตีสองประเภทเพื่อเข้าร่วม:
1. State Manager ผู้จัดการรัฐเป็นสวิตช์
2. คลาสหลักที่ดำเนินการโดยคลาสนามธรรมหรืออินเทอร์เฟซสถานะที่แตกต่างกันกำลังสืบทอดคลาสย่อยที่แตกต่างกันของคลาสแม่นี้
จากบริบทข้างต้นเป็นตัวอย่างเราต้องการแก้ไขและสร้างเอนทิตีสองประเภท
ขั้นตอนแรกคือการสร้างคลาสหลัก:
การคัดลอกรหัสมีดังนี้:
รัฐนามธรรมระดับรัฐ {
โมฆะนามธรรมสาธารณะที่ Handlepush (บริบท C);
โมฆะนามธรรมสาธารณะมือจับ (บริบท C);
นามธรรมนามธรรมสาธารณะ GetColor ();
-
วิธีการในคลาสหลักจะต้องสอดคล้องกับพฤติกรรมสวิตช์ในผู้จัดการรัฐ ต้องได้รับการจัดการโดยเฉพาะ
ต่อไปนี้คือการใช้งานของคลาสย่อยเฉพาะ:
การคัดลอกรหัสมีดังนี้:
Bluestate ชั้นเรียนสาธารณะขยายสถานะ {
โมฆะสาธารณะ HandlePush (บริบท C) {
// ตามวิธีการผลัก "ถ้าเป็นสีน้ำเงินสลับเป็นสีเขียว";
C.SetState (ใหม่ Greenstate ());
-
โมฆะสาธารณะ HandlePull (บริบท C) {
// ตามวิธีการดึง "ถ้าเป็นสีน้ำเงินสลับเป็นสีแดง";
C.SetState (ใหม่ redstate ());
-
นามธรรมนามธรรมสาธารณะ GetColor () {return (color.blue)}
-
ในทำนองเดียวกันคลาสย่อยในรัฐอื่น ๆ จะถูกนำมาใช้เป็นสีน้ำเงิน
ขั้นตอนที่สองคือการเขียนใหม่ผู้จัดการรัฐซึ่งเป็นบริบทของตัวอย่างนี้:
การคัดลอกรหัสมีดังนี้:
บริบทคลาส Ublic {
SATE STATE ส่วนตัว = NULL; // เราเปลี่ยนสถานะสีดั้งเดิมเป็นสถานะที่สร้างขึ้นใหม่
// setState ใช้เพื่อเปลี่ยนสถานะของสถานะโดยใช้ setState เพื่อให้ได้การสลับสถานะ
pulic void setState (สถานะสถานะ) {
this.state = state;
-
โมฆะสาธารณะผลัก () {
// รายละเอียดของการสลับสถานะอยู่ในกรณีนี้การเปลี่ยนสีซึ่งถูกห่อหุ้มไว้ในมือจับของคลาสย่อยและไม่จำเป็นต้องใส่ใจเกี่ยวกับ state.handlepush (นี้);
// เนื่องจากตัวอย่างจำเป็นต้องใช้ผลลัพธ์การสลับในสถานะใช้ getColor ()
ตัวอย่างตัวอย่าง = ตัวอย่างใหม่ (state.getColor ());
sample.operate ();
-
โมฆะสาธารณะดึง () {
state.handlepull (นี่);
ตัวอย่าง 2 ตัวอย่าง 2 = ตัวอย่างใหม่ 2 (state.getColor ());
sample2.operate ();
-
-
ณ จุดนี้เราได้ใช้กระบวนการ refactoring ของรัฐ
ข้างต้นเป็นเพียงตัวอย่างที่ค่อนข้างง่าย