1. รูปแบบสถานะคืออะไร
รูปแบบสถานะเป็นประเภทของรูปแบบการออกแบบพฤติกรรมที่ใช้เพื่อแก้ปัญหาของพฤติกรรมที่แตกต่างของออบเจ็กต์ในสถานะที่แตกต่างกัน มันครอบคลุมพฤติกรรมของออบเจ็กต์ในคลาสสถานะที่แตกต่างกัน ทำให้ออบเจ็กต์สามารถเปลี่ยนพฤติกรรมของมันในระหว่างเวลาการทำงานโดยอ้างอิงจากการเปลี่ยนแปลงของสถานะภายในของมัน
2. ลักษณะและข้อดีของรูปแบบสถานะ
ลักษณะหลักและข้อดีของรูปแบบสถานะมีดังนี้:
- ครอบคลุมตรรกะการตัดสินใจสถานะที่ซับซ้อนเข้าไปในคลาสสถานะที่แตกต่างกัน เพิ่มความสามารถในการบำรุงรักษาโค้ด
- หลักการเปิด/ปิด: โดยการเพิ่มคลาสสถานะใหม่ สถานะใหม่สามารถเพิ่มได้อย่างง่ายดาย
- แต่ละคลาสสถานะเป็นอิสระจากกัน การปรับเปลี่ยนคลาสสถานะหนึ่งจะไม่ส่งผลต่อโค้ดของคลาสสถานะอื่น
- ทำให้ตรรกะข้อความเงื่อนไขที่ซับซ้อนลดลง เพิ่มความคาดอ่านของโค้ดและการขยายตัวได้
3. ตัวอย่างการประยุกต์ใช้รูปแบบสถานะที่ใช้ในชีวิตจริง
รูปแบบสถานะมีการประยุกต์ใช้ในชีวิตจริงมากมาย เช่น:
- ไฟจราจรสัญญาณ: สัญญาณแสดงไฟสัญญาณทางจราจรต่างกันตามสถานะที่แตกต่างกัน
- การจัดการสถานะการสั่งซื้อ: การสั่งซื้อมีการดำเนินการและพฤติกรรมที่แตกต่างกันในสถานะที่แตกต่างกัน เช่น การชำระเงิน การจัดส่ง และการได้รับสินค้า
4. การนำรูปแบบสถานะมาใช้ใน Golang
4.1 แผนภาพคลาส UML
4.2 การแนะนำตัวอย่าง
ในตัวอย่างนี้ เราจะนำมาประยุกต์ใช้ระบบการจัดการสถานะของการสั่งซื้อที่ง่าย การสั่งซื้อมีสถานะหลายอย่าง เช่น การชำระเงิน การจัดส่ง และการได้รับสินค้า ซึ่งจะมีการดำเนินการและพฤติกรรมที่แตกต่างกันตามสถานะที่แตกต่างกัน
4.3 การสาธิตกรณีการนำมาใช้
4.3.1 กำหนดอินเตอร์เฟซสถานะของการสั่งซื้อและคลาสสถานะที่แน่นอน
// อินเตอร์เฟซสถานะ
type State interface {
Handle(context *Context)
}
// คลาสสถานะที่แน่นอน A
type ConcreteStateA struct {
name string
}
func (c *ConcreteStateA) Handle(context *Context) {
fmt.Println("สถานะปัจจุบันคือ:", c.name)
fmt.Println("กำลังดำเนินการที่เฉพาะเจาะจงสำหรับสถานะ A...")
context.SetState(&ConcreteStateB{name: "คลาสสถานะ B"})
}
// คลาสสถานะที่แน่นอน B
type ConcreteStateB struct {
name string
}
func (c *ConcreteStateB) Handle(context *Context) {
fmt.Println("สถานะปัจจุบันคือ:", c.name)
fmt.Println("กำลังดำเนินการที่เฉพาะเจาะจงสำหรับสถานะ B...")
context.SetState(&ConcreteStateA{name: "คลาสสถานะ A"})
}
4.3.2 กำหนดคลาสคอนเท็กซ์การสั่งซื้อและวิธีการสลับสถานะ
// คลาสคอนเท็กซ์
type Context struct {
state State
}
// ดำเนินการสั่งซื้อ
func (c *Context) Handle() {
c.state.Handle(c)
}
// กำหนดสถานะ
func (c *Context) SetState(state State) {
c.state = state
}
4.3.3 การนำมาใช้วิธีการสลับสถานะสำหรับคลาสสถานะที่แน่นอน
// วิธีการสลับสำหรับคลาสสถานะที่แน่นอน A
func (c *ConcreteStateA) SwitchStateB(context *Context) {
context.SetState(&ConcreteStateB{name: "คลาสสถานะ B"})
}
// วิธีการสลับสำหรับคลาสสถานะที่แน่นอน B
func (c *ConcreteStateB) SwitchStateA(context *Context) {
context.SetState(&ConcreteStateA{name: "คลาสสถานะ A"})
}
4.3.4 การจัดการสถานะการสั่งซื้อโดยใช้รูปแบบสถานะ
func main() {
// กำหนดคอนเท็กซ์การสั่งซื้อ
context := &Context{
state: &ConcreteStateA{name: "คลาสสถานะ A"},
}
// ดำเนินการสั่งซื้อ
context.Handle()
// สลับสถานะ
context.state.(*ConcreteStateA).SwitchStateB(context) // สลับไปยังคลาสสถานะ B
context.Handle()
context.state.(*ConcreteStateB).SwitchStateA(context) // สลับกลับไปยังคลาสสถานะ A
context.Handle()
}
สรุป
โดยใช้รูปแบบสถานะ เราสามารถจัดการพฤติกรรมของออบเจ็กต์ในสถานะต่างๆ ซึ่งเพิ่มความสามารถในการนำซ้ำโค้ดและการขยายตัวของโค้ด เราได้แสดงตัวอย่างการใช้ Golang ในการประยุกต์ใช้รูปแบบสถานะโดยใช้ระบบจัดการสถานะของการสั่งซื้อที่ง่าย และได้จัดเตรียมรหัสการประยุกต์ใช้และแผนภาพคลาส UML โดยสมบูรณ์ เราหวังว่าบทช่วยเหลือนี้จะช่วยให้คุณเข้าใใจและประยุกต์ใช้รูปแบบสถานะได้ดียิ่งขึ้น