Design Patterns: Mẫu Command

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Vấn đề đặt ra

Đôi khi chúng ta gặp tình huống trong đó cần phải gửi yêu cầu đến một đối tượng mà không biết cụ thể về đối tượng nhận yêu cầu cũng như phương thức xử lý yêu cầu. Lấy ví dụ về bộ công cụ giao diện người sử dụng cho phép xây dựng các menu. Rõ ràng, nó không thể xử lý trực tiếp yêu cầu trên các đối tượng menu vì cách thức xử lý phụ thuộc vào từng ứng dụng cụ thể.

Mẫu Command cho phép bộ công cụ như trên gửi yêu cầu đến các đối tượng chưa xác định bằng cách biến chính yêu cầu thành một đối tượng. Khái niệm quan trọng nhất của mẫu này là lớp trừu tượng Command có chức năng định nghĩa giao diện cho việc thi hành các yêu cầu. Trong trường hợp đơn giản nhất, ta chỉ cần định nghĩa một thủ tục ảo Execute trên giao diện đó. Các lớp con cụ thể của Command sẽ xác định cặp đối tượng nhận yêu cầu-các thao tác bằng cách lưu trữ một tham chiếu đến đối tượng nhận yêu cầu và định nghĩa lại thủ tục Execute để gọi các thủ tục xử lý.

command

Theo cách này, chương trình sẽ có nhiệm vụ tạo ra các menu, menuitem và gán mỗi menuitem với một đối tượng thuộc lớp con cụ thể của Command. Khi người sử dụng chọn một menuitem, nó sẽ gọi hàm command->Execute() mà không cần con trỏ command trỏ đến loại lớp con cụ thể nào của lớp Command. Hàm Execute() sẽ có nhiệm vụ xử lý yêu cầu.

Định nghĩa mẫu

Mẫu Command đóng gói yêu cầu như là một đối tượng, làm cho nó có thể được truyền như một tham số, được lưu trữ trong một history list hoặc thao tác theo những cách thức khác nhau.

Sơ đồ UML

command: uml diagram

Command (Command)

  • Khai báo một giao diện cho việc thực thi một thao tác

ConcreteCommand (CalculatorCommand)

  • Định nghĩa một liên kết giữa một đối tượng Receiver và một hành động
  • Cài đặt Execute bằng cách gọi một thao tác tương ứng trên Receiver

Client (CommandApp)

  • Tạo ra một đối tượng ConcreteCommand và thiết lập đối tượng nhận của nó

Invoker (User)

  • Đề nghị command để thực hiệu yêu cầu

Receiver (Calculator)

  • Biết cách để thực hiện các thao tác kết hợp việc thực hiện các yêu cầu

Ứng dụng

Dùng mẫu Command khi :

  • Tham số hoá các đối tượng theo thủ tục mà chúng thi hành, như đối tượng MenuItem ở trên.
  • Xác định, xếp hàng và thi hành các yêu cầu tại những thời điểm khác nhau.
  • Cho phép quay ngược. Thủ tục Execute của lớp Command có thể lưu lại trạng thái để cho phép quay ngược các biến đổi mà nó gây ra. Khi đó lớp Command trừu tượng cần định nghĩa thêm hàm Unexecute để đảo ngược các biến đổi. Các commands đã được thi hành sẽ được lưu trong một danh sách, từ đó cho phép undo và redo không giới hạn mức.
  • Cần hỗ trợ ghi lại các commands đã đựơc thi hành để thi hành lại trong trường hợp hệ thống gặp sự cố.
  • Thiết kế một hệ thống với các thủ tục bậc cao đựơc xây dựng dựa trên các thủ tục nguyên thuỷ. Cấu trúc này thường gặp trong các hệ thống thông tin hỗ trợ “phiên giao dịch”. Một phiên giao dịch là một tập hợp các sự thay đổi lên dữ liệu. Mẫu Command cung cấp cách thức mô tả phiên giao dịch. Nó có giao diện chung cho phép khởi xướng các phiên làm vịêc với cùng một cách thức và cũng cho phép dễ dàng mở rộng hệ thống với các phiên giao dịch mới.

Các mẫu liên quan

Một Composite có thể được sử dụng để cài đặt các MacroCommands.

Một Memmento có thể lưu lại các trạng thái để Command yêu cầu phục hồi lại các hiệu ứng của nó.

Một command phải được sao lưu trước khi nó được thay thế bằng các hành động trước đó như là một Prototype.

» Tiếp: Mẫu Interperter
« Trước: Mẫu Chain of Responsibility
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!