TopDev

Command Pattern là gì ? Command Pattern được sử dụng khi nào

minhu 📖 3 phút đọc

Command Pattern là một mẫu thiết kế hành vi trong lập trình hướng đối tượng. Nó cho phép bạn đóng gói các yêu cầu hoặc hành động dưới dạng các đối tượng, do đó bạn có thể tham số hóa các phương thức với các yêu cầu khác nhau, xếp hàng hoặc ghi log các yêu cầu, và hỗ trợ thao tác "undo" các thao tác.

Định nghĩa#

Command Pattern biến một yêu cầu thành một đối tượng, cho phép bạn tham số hóa các đối tượng với các yêu cầu khác nhau, xếp hàng các yêu cầu, và hỗ trợ thao tác undoable (có thể hoàn tác).

Cấu trúc#

Command Pattern bao gồm các thành phần sau:

  • Command: Giao diện hoặc lớp trừu tượng xác định phương thức thực thi (execute).

  • Concrete Command: Các lớp triển khai cụ thể của Command, thực hiện các hành động cụ thể bằng cách gọi các phương thức của Receiver.

  • Client: Tạo đối tượng ConcreteCommand và gán Receiver cho nó.

  • Invoker: Đối tượng chịu trách nhiệm kích hoạt các lệnh ở một thời điểm nào đó.

  • Receiver: Lớp thực hiện các hành động cụ thể liên quan đến lệnh.

Khi nào sử dụng Command Pattern?#

Command Pattern được sử dụng khi:

  • Bạn muốn tham số hóa các đối tượng với các hoạt động khác nhau: Command Pattern cho phép bạn truyền các hành động như là tham số cho các phương thức hoặc đối tượng.

  • Bạn cần xếp hàng các yêu cầu hoặc thực thi chúng ở những thời điểm khác nhau: Command Pattern cho phép bạn xếp hàng và thực thi các lệnh sau.

  • Bạn cần hỗ trợ chức năng undo/redo: Command Pattern cho phép lưu trữ trạng thái trước đó để có thể hoàn tác các hành động.

  • Bạn cần ghi log các thay đổi hoặc yêu cầu: Command Pattern giúp ghi log các yêu cầu và trạng thái của chúng.

  • Bạn muốn tách biệt các đối tượng phát lệnh và các đối tượng thực thi lệnh: Command Pattern giúp tách biệt sự phụ thuộc giữa các lớp.

Ví dụ minh họa#

Dưới đây là một ví dụ đơn giản về Command Pattern trong Java.

1. Tạo giao diện Command

public interface Command { void execute(); }

2. Tạo lớp Receiver

` public class Light { public void turnOn() { System.out.println("The light is on"); }

public void turnOff() {
    System.out.println("The light is off");
}

} `

3. Tạo các lớp Concrete Command

` public class TurnOnLightCommand implements Command { private Light light;

public TurnOnLightCommand(Light light) {
    this.light = light;
}

@Override
public void execute() {
    light.turnOn();
}

}

public class TurnOffLightCommand implements Command { private Light light;

public TurnOffLightCommand(Light light) {
    this.light = light;
}

@Override
public void execute() {
    light.turnOff();
}

} `

4. Tạo lớp Invoker

` public class RemoteControl { private Command command;

public void setCommand(Command command) {
    this.command = command;
}

public void pressButton() {
    command.execute();
}

} `

5. Sử dụng Command Pattern

` public class Client { public static void main(String[] args) { Light livingRoomLight = new Light();

    Command turnOn = new TurnOnLightCommand(livingRoomLight);
    Command turnOff = new TurnOffLightCommand(livingRoomLight);

    RemoteControl remote = new RemoteControl();
    
    // Turn on the light
    remote.setCommand(turnOn);
    remote.pressButton();

    // Turn off the light
    remote.setCommand(turnOff);
    remote.pressButton();
}

} `

Kết luận#

Command Pattern là một mẫu thiết kế mạnh mẽ cho phép bạn xử lý các yêu cầu và hành động một cách linh hoạt và có cấu trúc. Nó đặc biệt hữu ích khi bạn cần hỗ trợ undo/redo, xếp hàng hoặc ghi log các hành động, và tách biệt sự phụ thuộc giữa các lớp.

Bài liên quan trong #Tin tức

✓ Đã sao chép link