1. State Pattern là gì

State pattern là một loại mẫu thiết kế hành vi được sử dụng để giải quyết vấn đề về hành vi khác nhau của một đối tượng trong các trạng thái khác nhau. Nó đóng gói hành vi của đối tượng thành các lớp trạng thái khác nhau, cho phép đối tượng thay đổi hành vi của mình vào thời gian chạy dựa trên sự thay đổi trong trạng thái nội bộ của nó.

2. Đặc điểm và Ưu điểm của State Pattern

Các đặc điểm chính và ưu điểm chính của state pattern như sau:

  • Nó đóng gói logic phán đoán trạng thái phức tạp vào các lớp trạng thái khác nhau, nâng cao tính bảo trì của mã nguồn.
  • Nguyên lý Mở/Đóng: Bằng cách thêm các lớp trạng thái mới, các trạng thái mới có thể dễ dàng được thêm vào.
  • Mỗi lớp trạng thái là độc lập với nhau, sửa đổi một lớp trạng thái sẽ không ảnh hưởng đến mã nguồn của các lớp trạng thái khác.
  • Đơn giản hóa logic câu lệnh điều kiện, cải thiện tính đọc và khả năng mở rộng của mã nguồn.

3. Ví dụ về Ứng dụng Thực tế của State Pattern

State pattern có nhiều ứng dụng thực tế trong cuộc sống, như:

  • Đèn giao thông: Ánh sáng khác nhau được phát ra bởi đèn giao thông dựa trên các trạng thái khác nhau.
  • Quản lý trạng thái đơn hàng: Đơn hàng có các hoạt động và hành vi khác nhau trong các trạng thái khác nhau, như đã thanh toán, đã vận chuyển và đã nhận.

4. Thực hiện State Pattern trong Golang

4.1 Sơ đồ lớp UML

State Pattern in Golang

4.2 Giới thiệu ví dụ

Trong ví dụ này, chúng ta sẽ thực hiện một hệ thống quản lý trạng thái đơn hàng đơn giản. Đơn hàng có nhiều trạng thái, chẳng hạn như đã thanh toán, đã vận chuyển và đã nhận. Dựa trên các trạng thái khác nhau, đơn hàng có các hoạt động và hành vi khác nhau.

4.3 Trình diễn trường hợp thực hiện

4.3.1 Định nghĩa giao diện trạng thái đơn hàng và các lớp trạng thái cụ thể

// Giao diện trạng thái
type State interface {
	Handle(context *Context)
}

// Lớp trạng thái cụ thể A
type ConcreteStateA struct {
	name string
}

func (c *ConcreteStateA) Handle(context *Context) {
	fmt.Println("Trạng thái hiện tại là:", c.name)
	fmt.Println("Thực hiện hoạt động cụ thể cho trạng thái A...")
context.SetState(&ConcreteStateB{name: "Trạng thái B cụ thể"})
}

// Lớp trạng thái cụ thể B
type ConcreteStateB struct {
	name string
}

func (c *ConcreteStateB) Handle(context *Context) {
	fmt.Println("Trạng thái hiện tại là:", c.name)
	fmt.Println("Thực hiện hoạt động cụ thể cho trạng thái B...")
context.SetState(&ConcreteStateA{name: "Trạng thái A cụ thể"})
}

4.3.2 Định nghĩa lớp ngữ cảnh đơn hàng và phương thức chuyển trạng thái

// Lớp ngữ cảnh
type Context struct {
	state State
}

// Xử lý đơn hàng
func (c *Context) Handle() {
	c.state.Handle(c)
}

// Thiết lập trạng thái
func (c *Context) SetState(state State) {
	c.state = state
}

4.3.3 Thực hiện các phương thức chuyển trạng thái cho các lớp trạng thái cụ thể

// Phương thức chuyển trạng thái cho lớp trạng thái cụ thể A
func (c *ConcreteStateA) SwitchStateB(context *Context) {
	context.SetState(&ConcreteStateB{name: "Trạng thái B cụ thể"})
}

// Phương thức chuyển trạng thái cho lớp trạng thái cụ thể B
func (c *ConcreteStateB) SwitchStateA(context *Context) {
	context.SetState(&ConcreteStateA{name: "Trạng thái A cụ thể"})
}

4.3.4 Quản lý Trạng thái Đơn hàng bằng State Pattern

func main() {
	// Khởi tạo ngữ cảnh đơn hàng
	context := &Context{
		state: &ConcreteStateA{name: "Trạng thái A cụ thể"},
	}

	// Xử lý đơn hàng
	context.Handle()

	// Chuyển trạng thái
	context.state.(*ConcreteStateA).SwitchStateB(context) // Chuyển sang Trạng thái B cụ thể
	context.Handle()

	context.state.(*ConcreteStateB).SwitchStateA(context) // Chuyển lại Trạng thái A cụ thể
	context.Handle()
}

Tóm lược

Bằng cách sử dụng state pattern, chúng ta có thể quản lý tốt hơn hành vi của các đối tượng trong các trạng thái khác nhau, cải thiện tính tái sử dụng mã nguồn và tính mở rộng của nó. Trong hướng dẫn này, chúng tôi đã trình bày cách sử dụng Golang để triển khai state pattern bằng cách sử dụng một hệ thống quản lý đơn hàng đơn giản và cung cấp một triển khai mã nguồn hoàn chỉnh và sơ đồ lớp UML. Chúng tôi hy vọng hướng dẫn này có thể giúp bạn hiểu và áp dụng state pattern một cách tốt hơn.