1. ภาพรวม
เมื่อมีหลายสถานะสำหรับวัตถุในระบบสถานะสามารถแปลงระหว่างพวกเขาและวัตถุทำงานแตกต่างกันในสถานะที่แตกต่างกัน โหมดสถานะจะแยกสถานะของวัตถุออกจากวัตถุและสรุปไว้ในคลาสสถานะพิเศษเพื่อให้สถานะวัตถุสามารถเปลี่ยนแปลงได้อย่างยืดหยุ่น โหมดสถานะเป็นโหมดพฤติกรรมวัตถุ
2. สถานการณ์ที่เกี่ยวข้อง
ใช้ในการแก้ปัญหาการห่อหุ้มของการเปลี่ยนสถานะหลายรัฐของวัตถุที่ซับซ้อนในระบบและพฤติกรรมภายใต้สถานะที่แตกต่างกัน พูดง่ายๆคือการจัดการกับวัตถุหลายสถานะและการแปลงร่วมกัน
iii. ไดอะแกรมคลาส UML
4. ผู้เข้าร่วม
1), AbstractState (ระดับรัฐนามธรรม):
คลาสรัฐนามธรรมกำหนดวิธีการพฤติกรรมบทคัดย่อภายใต้สถานะที่แตกต่างกันและการดำเนินการเชิงพฤติกรรมที่แตกต่างกันจะถูกนำไปใช้ในคลาสย่อย (คลาสย่อยสถานะที่แตกต่างกัน)
2) Concretestate (subclass สถานะที่ใช้พฤติกรรมในสถานะเฉพาะ):
คลาสย่อยของคลาสสถานะนามธรรมแต่ละคลาสย่อยใช้พฤติกรรมที่เกี่ยวข้องกับสถานะของคลาสสภาพแวดล้อม (บริบท) แต่ละระดับรัฐเฉพาะนั้นสอดคล้องกับสถานะเฉพาะของสภาพแวดล้อมและพฤติกรรมของสถานะเฉพาะที่แตกต่างกันนั้นแตกต่างกัน
3) บริบท (คลาสสภาพแวดล้อมที่เป็นเจ้าของวัตถุของรัฐ):
การมีคุณลักษณะของรัฐเนื่องจากความหลากหลายของสิ่งแวดล้อมมันสามารถมีรัฐที่แตกต่างกันและทำงานแตกต่างกันภายใต้รัฐที่แตกต่างกัน รักษาอินสแตนซ์ของรัฐนามธรรมในระดับสภาพแวดล้อม อินสแตนซ์นี้กำหนดสถานะของสภาพแวดล้อมปัจจุบัน (setState () วิธี) และแยกพฤติกรรมของสถานะเฉพาะและเสร็จสิ้นโดยคลาสย่อยสถานะที่แตกต่างกัน
5. ใช้การเรียนรู้กรณี
1. ระดับรัฐนามธรรม: state.java
/ *** โหมดสถานะของรูปแบบการออกแบบ Java* Abstract State Class* @author [email protected]**/ สถานะระดับนามธรรมสาธารณะ {/ *** พฤติกรรมของรัฐวิธีการบทคัดย่อวิธีการย่อยสถานะเฉพาะใช้ตรรกะพฤติกรรมที่แตกต่างกัน*/ พฤติกรรม -
2. subclass สถานะเฉพาะ A: Concretestatea.java
/ ** * subclass สถานะเฉพาะ * @author [email protected] */ คลาสสาธารณะ concretestatea ขยายสถานะ {@Override พฤติกรรมโมฆะสาธารณะ () {// พฤติกรรมทางธุรกิจของรัฐ A การชำระเงิน"); -
3. subclass สถานะเฉพาะ B: Concretestateb.java
/ ** * subclass สถานะเฉพาะ b * @author [email protected] * */ คลาสสาธารณะ concretestateB ขยายสถานะ {@Override พฤติกรรมโมฆะสาธารณะ () {// พฤติกรรมทางธุรกิจของรัฐ B โทร "); -
4. คลาสสิ่งแวดล้อมที่มีวัตถุสถานะ: บริบท java
/** * คลาสสภาพแวดล้อม/บริบท <br/> * มีวัตถุสถานะและสามารถเปลี่ยนผ่านระหว่างรัฐ [การเปลี่ยนแปลงสถานะ/การสลับถูกนำไปใช้ในคลาสสภาพแวดล้อม] * @author [email protected] * */บริบทคลาสสาธารณะ / * * จำลองแอตทริบิวต์ค่าธรรมเนียมการโทรโทรศัพท์มือถือ <br/> * สถานะสภาพแวดล้อมมีดังนี้: * 1> เมื่อบิล> = 0.00 $: เมื่อรัฐเป็นปกติคุณยังสามารถโทรออกได้ * 2> เมื่อบิล <0.00 $: เมื่อโทรศัพท์เป็นหนี้ /*** ฟังก์ชั่นการประมวลผลสิ่งแวดล้อมการเรียกสถานะอินสแตนซ์ของสถานะการเรียกใช้ตรรกะทางธุรกิจ <br/>* การอ้างอิงถึงพฤติกรรมที่แตกต่างกันในสถานะต่าง ๆ*/การจัดการโมฆะสาธารณะ () {checkState (); state.behavior (); }/*** ตรวจสอบสถานะสภาพแวดล้อม: การเปลี่ยนแปลงสถานะ/การสลับถูกนำไปใช้ในคลาสสภาพแวดล้อม*/โมฆะส่วนตัว checkState () {ถ้า (บิล> = 0.00) {setState (ใหม่ concretestatea ()); } else {setState (ใหม่ concretestateB ()); }}/** * ตั้งค่าสถานะสภาพแวดล้อม <br/> * วิธีการส่วนตัววัตถุประสงค์คือเพื่อให้สถานะของสภาพแวดล้อมถูกควบคุม/เปลี่ยนโดยสภาพแวดล้อมของระบบเองและผู้ใช้ภายนอกไม่จำเป็นต้องใส่ใจเกี่ยวกับสถานะภายในสภาพแวดล้อม * @param state */void ส่วนตัว } สาธารณะ double getBill () {Bill return; } โมฆะสาธารณะ setBill (สองครั้ง) {this.bill = Bill; -
5. การทดสอบคลาสการโทรไคลเอนต์: client.java
ไคลเอนต์คลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {บริบทบริบท = บริบทใหม่ (); Context.setBill (5.50); System.out.println ("ยอดเงินค่าธรรมเนียมการโทรปัจจุบัน:" + context.getBill () + "$"); Context.handle (); Context.setBill (-1.50); System.out.println ("ยอดเงินค่าธรรมเนียมการโทรปัจจุบัน:" + context.getBill () + "$"); Context.handle (); Context.setBill (50.00); System.out.println ("ยอดเงินค่าธรรมเนียมการโทรปัจจุบัน:" + context.getBill () + "$"); Context.handle (); - 6. ผลการดำเนินงานของโปรแกรม:
ยอดเงินค่าธรรมเนียมการโทรปัจจุบัน: 5.5 $
ยอดเงินค่าโทรศัพท์ปัจจุบันสามารถทำได้ตามปกติเมื่อโทรศัพท์ไม่ได้ลดลงเนื่องจากการชำระเงินดาวน์: -1.5 $
ไม่อนุญาตให้มียอดเงินค่าธรรมเนียมโทรศัพท์ในปัจจุบันเมื่อโทรศัพท์ไม่ได้ให้บริการ
โทรศัพท์สามารถโทรออกได้ตามปกติโดยไม่ต้องชำระเงินดาวน์ใด ๆ
VI. ขยาย
มีการใช้งานที่แตกต่างกันสองประการของการสลับสถานะในโหมดสถานะ
วิธีที่ 1: การเปลี่ยนแปลง/การสลับสถานะถูกนำมาใช้ในคลาสสภาพแวดล้อม เช่นเดียวกับในรหัสกรณีการใช้งานด้านบนเมธอด checkState () ในคลาสบริบท
/*** ตรวจสอบสถานะสภาพแวดล้อม: การเปลี่ยนแปลง/การสลับสถานะถูกนำไปใช้ในคลาสสภาพแวดล้อม*/โมฆะส่วนตัว checkState () {ถ้า (บิล> = 0.00) {setState (ใหม่ concretestatea ()); } else {setState (ใหม่ concretestateB ()); - วิธีที่ 2: การเปลี่ยนแปลง/การสลับสถานะถูกนำไปใช้ในคลาสย่อยของสถานะเฉพาะ
ขั้นตอนการใช้งานมีดังนี้:
1) เริ่มต้นวัตถุอินสแตนซ์สถานะในคลาสบริบทของคลาสสภาพแวดล้อมและส่งผ่านวัตถุบริบทของสภาพแวดล้อมเป็นพารามิเตอร์ตัวสร้างของสถานะ subclass ไปยังอินสแตนซ์ subclass สถานะเฉพาะ
ตัวอย่างเช่นในคลาสบริบท Java
// ตั้งค่าสถานะเริ่มต้น this.state = ใหม่ concretestatea (นี่);
2) ในคลาส Subclass State เฉพาะตามวัตถุบริบทที่สร้างขึ้นตรรกะทางธุรกิจตัดสินสถานะโดยเรียกค่าคุณสมบัติของวัตถุบริบท
ตัวอย่างเช่นในคลาส Concretestatea.java, คลาสย่อยของสถานะเฉพาะ:
/ ** * subclass สถานะเฉพาะ A * @author [email protected] */ คลาสสาธารณะ concretestatea ขยายสถานะ {บริบทส่วนตัว ctx; Concretestatea สาธารณะ (บริบทบริบท) {CTX = บริบท; } @Override พฤติกรรมโมฆะสาธารณะ () {// พฤติกรรมทางธุรกิจของรัฐ A และสิ่งที่สามารถทำได้เมื่ออยู่ในสถานะนี้ // ตัวอย่างเช่นโทรศัพท์มือถือสามารถโทรออกได้ตามปกติเมื่อไม่ได้ลงเนื่องจากระบบการชำระเงินลง checkState (); }/** * ตรวจสอบว่าต้องมีการแปลงสถานะหรือไม่ <br/> * การสลับสถานะจะถูกนำไปใช้ในคลาสย่อยสถานะเฉพาะ */โมฆะส่วนตัว checkState () {ถ้า (ctx.getBill () <0.00) {ctx.setState -
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น