1. รูปแบบสถานะคืออะไร

รูปแบบสถานะเป็นประเภทของรูปแบบการออกแบบพฤติกรรมที่ใช้เพื่อแก้ปัญหาของพฤติกรรมที่แตกต่างของออบเจ็กต์ในสถานะที่แตกต่างกัน มันครอบคลุมพฤติกรรมของออบเจ็กต์ในคลาสสถานะที่แตกต่างกัน ทำให้ออบเจ็กต์สามารถเปลี่ยนพฤติกรรมของมันในระหว่างเวลาการทำงานโดยอ้างอิงจากการเปลี่ยนแปลงของสถานะภายในของมัน

2. ลักษณะและข้อดีของรูปแบบสถานะ

ลักษณะหลักและข้อดีของรูปแบบสถานะมีดังนี้:

  • ครอบคลุมตรรกะการตัดสินใจสถานะที่ซับซ้อนเข้าไปในคลาสสถานะที่แตกต่างกัน เพิ่มความสามารถในการบำรุงรักษาโค้ด
  • หลักการเปิด/ปิด: โดยการเพิ่มคลาสสถานะใหม่ สถานะใหม่สามารถเพิ่มได้อย่างง่ายดาย
  • แต่ละคลาสสถานะเป็นอิสระจากกัน การปรับเปลี่ยนคลาสสถานะหนึ่งจะไม่ส่งผลต่อโค้ดของคลาสสถานะอื่น
  • ทำให้ตรรกะข้อความเงื่อนไขที่ซับซ้อนลดลง เพิ่มความคาดอ่านของโค้ดและการขยายตัวได้

3. ตัวอย่างการประยุกต์ใช้รูปแบบสถานะที่ใช้ในชีวิตจริง

รูปแบบสถานะมีการประยุกต์ใช้ในชีวิตจริงมากมาย เช่น:

  • ไฟจราจรสัญญาณ: สัญญาณแสดงไฟสัญญาณทางจราจรต่างกันตามสถานะที่แตกต่างกัน
  • การจัดการสถานะการสั่งซื้อ: การสั่งซื้อมีการดำเนินการและพฤติกรรมที่แตกต่างกันในสถานะที่แตกต่างกัน เช่น การชำระเงิน การจัดส่ง และการได้รับสินค้า

4. การนำรูปแบบสถานะมาใช้ใน Golang

4.1 แผนภาพคลาส UML

รูปแบบสถานะใน Golang

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 โดยสมบูรณ์ เราหวังว่าบทช่วยเหลือนี้จะช่วยให้คุณเข้าใใจและประยุกต์ใช้รูปแบบสถานะได้ดียิ่งขึ้น