© 2026 Laravel

State Pattern: Quản lý Workflow phức tạp

2 phút đọc
#design-patterns #php #laravel #workflow #behavior

#1. Vấn đề

Đơn hàng (Order) có các trạng thái: Pending, Paid, Shipped, Cancelled. Mỗi trạng thái có hành vi khác nhau (ví dụ: Paid mới cho xuất hàng, Cancelled không cho chỉnh sửa). Viết if/else theo trạng thái sẽ làm Model bị “phình to” kinh khủng.

#2. Định nghĩa

State Pattern (Nhóm Behavioral) cho phép một đối tượng thay đổi hành vi của mình khi trạng thái bên trong thay đổi. Đối tượng đó sẽ trông như thể nó thay đổi lớp (class) của mình.

#3. Cách giải quyết

interface OrderState { public function ship(Order $order); }

class PaidState implements OrderState {
    public function ship(Order $order) { $order->setState(new ShippedState()); }
}

#4. Khi nào áp dụng

  • Khi object có quá nhiều trạng thái và hành vi phụ thuộc vào trạng thái đó.
  • Tránh if hoặc switch dài lê thê trong class.

#5. Câu hỏi phỏng vấn

  • Q: Khác biệt với Strategy? Strategy là người gọi chọn hành vi. State là đối tượng tự thay đổi hành vi dựa trên trạng thái nội tại.
  • Q: Có cách nào áp dụng đơn giản hơn trong Laravel? Có, dùng package spatie/laravel-model-states – giúp quản lý state bằng class rất chuyên nghiệp.

Bài viết liên quan

Design Pattern là gì?

Tìm hiểu Design Pattern là gì, cách hoạt động, sự khác biệt với thuật toán và phân loại 3 nhóm Design Pattern phổ biến trong lập trình.

4 phút đọc