Học Design Pattern: Command Pattern – Việc Của Anh Là Chỉ Đạo
Command Pattern là một Behavioral Pattern với tư duy đưa các request trong chương trình phần mềm của bạn gói gọn trong 1 Object (object này chứa đầy đủ thông tin cần thiết để thực thi) và xử lý chúng khi cần thiết. Mỗi khi cần thực hiện điều gì bạn chỉ cần gửi đi 1 Object chứa các thông tin chi tiết, ở đầu nhận sẽ thực thi đúng với yêu cầu và đặc tả bạn đã định ra sẵn.
Mô hình thường gặp: TaskExecutors (Java), Handler (Android Threads), Flow (Kotlin Coroutines), RxJava, Event Queue, …
Vấn Đề Trong Phần Mềm: UI và Logic
Hình dung một tình huống quen thuộc trong việc phát triển Mobile app: xây dựng UI với các Button và Menu để kích hoạt các thao tác khác nhau.
Một cách tiếp cận đơn giản là code trực tiếp các xử lý UI Event ngay tại thời điểm nhận Event để đảm bảo tính tức thì của các Event đó.
Tuy nhiên, cách làm này có thể dẫn đến một số vấn đề:
- UI và Logic bị dính vào nhau: Code UI phụ thuộc trực tiếp vào Biz Logic, khiến việc sửa đổi hoặc tái sử dụng các component một cách độc lập trở nên khó khăn.
- Code có khả năng bị duplicate: Cùng một logic có thể cần được kích hoạt từ nhiều UI Element khác nhau, dẫn đến code bị lặp nhiều lần.

Giải Pháp: Commander Xuất Hiện
Command Pattern đưa ra một giải pháp là sử dụng một Mid-man: Command Object. Thay vì để một UI trực tiếp thực thi một action/function, nó sẽ tạo một Command Object, Object này sẽ gói gọn tất cả thông tin cần thiết về hành động đó:
- Receiver là ai?
- Action là gì?
- Params (các tham số) giá trị như thế nào?
UI (vai trò là Sender hoặc Invoker) chỉ đơn giản là kích hoạt Command với Command Object, Object này sẽ tự lo việc thực thi hành động trên Receiver phù hợp.
Cách làm này tạo ra một sự tách biệt rõ ràng giữa UI và Business Logic.
Lợi Ích Của Command Pattern
- Tham số hóa các Function Call: Giờ đây các function call của bạn có thể dễ dàng được tham số hóa vào một Object và tách riêng biệt so với caller. Điều này giúp chúng ta chia nhỏ Code đến mức đáng kể, nó hữu hiệu vì Code càng chia nhỏ, càng dễ Test và viết Unit Test.
- Toàn quyền Delay, Suspend, Defer, hay Drop: Các Command được tạo ra có thể được đưa vào Queue và thực thi vào một thời điểm sau đó. Ta có thể vận dụng tính cơ động này để giải quyết các bài toán liên quan đến bất đồng bộ, deadlock nhờ cơ chế tuần tự.
- Logging: Khi đưa hết các Command vào 1 Queue, điều đó đồng nghĩa với việc bạn sẽ có toàn quyền giám sát và kiểm soát Command. Lúc này ta có thể triển khai một hệ thống ghi Log để kiểm soát tình hình hệ thống, phục vụ trace back sau này khi có nhu cầu.
Hãy theo dõi kênh Youtube, Facebook của mình để cập nhật thêm nhiều kiến thức nha!