1.1 Định nghĩa và Khái niệm

Mẫu lệnh là một mẫu thiết kế hành vi cho phép đóng gói yêu cầu thành một đối tượng, từ đó bạn có thể tham số hóa khách hàng với các yêu cầu khác nhau.

1.2 Mục đích của Mẫu lệnh

Mục đích chính của mẫu lệnh là phân biệt gửi và nhận. Bằng cách đóng gói yêu cầu thành một đối tượng, người gửi chỉ cần tương tác với đối tượng lệnh, mà không cần tương tác trực tiếp với người nhận.

2. Đặc điểm và Ưu điểm của Mẫu lệnh

Mẫu lệnh có những đặc điểm và ưu điểm sau:

  • Đóng gói yêu cầu thành một đối tượng phân biệt người gửi và người nhận.
  • Có thể xếp hàng yêu cầu, ghi lại nhật ký và thực hiện các hoạt động hoàn tác.
  • Có thể mở rộng các lệnh mới mà không cần thay đổi mã nguồn gốc.

3. Ví dụ Vận dụng Thực tế của Mẫu lệnh

Mẫu lệnh được áp dụng trong các tình huống sau:

  • Cần phân biệt yêu cầu từ đối tượng thực hiện lệnh.
  • Hỗ trợ các hoạt động hoàn tác và làm lại.
  • Thực hiện một tập hợp các hoạt động theo cách xếp hàng.

4.1 Sơ đồ lớp UML

Mẫu lệnh Golang

4.2 Giới thiệu Ví dụ

Trong ví dụ này, chúng ta sẽ tạo một cài đặt đơn giản của mẫu lệnh. Giả sử chúng ta có một TV là người nhận, có khả năng thực hiện các hành động bật và tắt. Chúng ta cũng có một bộ điều khiển từ xa là người gọi, có thể đặt các lệnh cụ thể và thực thi chúng.

4.3.1 Định nghĩa Giao diện Lệnh

type ICommand interface {
    Execute()
}

4.3.2 Thực hiện Lớp Lệnh Cụ thể

type ConcreteCommand struct {
    receiver IReceiver
}

func (c *ConcreteCommand) Execute() {
    c.receiver.Action()
}

4.3.3 Định nghĩa Giao diện Người nhận

type IReceiver interface {
    Action()
}

4.3.4 Thực hiện Lớp Người nhận Cụ thể

type Receiver struct {}

func (r *Receiver) Action() {
    fmt.Println("Thực hiện hành động")
}

4.3.5 Thực hiện Vai trò Người gọi

type Invoker struct {
    command ICommand
}

func (i *Invoker) SetCommand(command ICommand) {
    i.command = command
}

func (i *Invoker) ExecuteCommand() {
    i.command.Execute()
}

4.3.6 Ví dụ mã nguồn khách hàng

func main() {
    receiver := &Receiver{}
    command := &ConcreteCommand{receiver: receiver}
    invoker := &Invoker{}
    invoker.SetCommand(command)
    invoker.ExecuteCommand()
}

5. Sự khác biệt giữa Mẫu lệnh và Mẫu chiến lược

Mẫu lệnh và mẫu chiến lược tương tự đến một mức độ nào đó, vì cả hai đều đóng gói một số hành vi thành đối tượng. Sự khác biệt nằm ở chỗ mẫu lệnh chủ yếu được sử dụng để đóng gói yêu cầu thành đối tượng và thực hiện các chức năng như hoàn tác và thực thi hàng đợi, trong khi mẫu chiến lược chủ yếu được sử dụng để đóng gói một loạt thuật toán và chọn một thuật toán để thực thi động vào thời gian chạy.

Mẫu lệnh phù hợp hơn cho các hoạt động như ghi nhật ký và kế toán, trong khi mẫu chiến lược phù hợp hơn cho sự linh hoạt trong việc thay đổi logic kinh doanh.