Command Pattern tối giản bằng Java Method References

Command Pattern chuyển đổi một yêu cầu thành một đối tượng độc lập chứa tất cả thông tin về yêu cầu đó. Việc chuyển đổi này cho phép tham số hóa các phương thức với các yêu cầu khác nhau.

Kiến trúc Command Pattern:

Command Design Pattern Architecture

Legacy Command Pattern

Ta thường phải tạo một interface Command và vô số concrete class như LightOnCommand, LightOffCommand chỉ để chạy một hàm duy nhất:

interface Command {
    void execute();
}
class LightOnCommand implements Command {
    private Light light;
    public LightOnCommand(Light l) { this.light = l; }
    public void execute() { light.turnOn(); }
}

Modern Command Pattern với Method References

Vì Command chỉ có một phương thức thực thi execute(), ta có thể dùng java.lang.Runnable hoặc bất kỳ Functional Interface nào, đồng thời gán trực tiếp phương thức của Receiver mà không cần khai báo lớp Command trung gian nào:

public class RemoteControl {
    private Runnable command;

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

    public void pressButton() {
        if (command != null) command.run();
    }
}

// Lớp Receiver thực thi hành động
public class Light {
    public void turnOn() { System.out.println("Đèn sáng!"); }
    public void turnOff() { System.out.println("Đèn tắt!"); }
}

// Cách sử dụng siêu gọn:
RemoteControl remote = new RemoteControl();
Light livingRoomLight = new Light();

// Gán trực tiếp method reference làm Command
remote.setCommand(livingRoomLight::turnOn);
remote.pressButton();

Code tinh gọn cực độ, không còn tình trạng phình to số lượng class trong project.

Bình luận (0)

Đang tải bình luận...