DEV Community

Tình Hoàng Xuân
Tình Hoàng Xuân

Posted on

#2 Command Pattern

1 Problem

  • Client họ chỉ muốn gửi yêu cầu, họ không quan tâm yêu cầu đó sẽ được xử lý như thế nào và khi nào. Họ chỉ quan tâm yêu cầu đó sẽ được thực hiện.

2 Định nghĩa

  • Command Pattern đóng gói 1 request thành 1 cái object và từ đó cho phép bạn tham số hoá object đó(pass params thông qua constructor) để thực hiện các request khác nhau, queue and log và undo hành động trước đó

3 Các thành phần trong Command Pattern

  • ICommand: là một interface or abstract class khai báo các phương thức chung của 1 yêu cầu

  • Concrete Command: là các lớp sẽ implement ICommand. Nó sẽ đóng gói một hành động cụ thể và chứa thông tin cần thiết để thực hiện yêu cầu đó.Nó thường tham chiếu tới 1 Receiver và gọi 1 phương thức trên Receiver khi lệnh được thực thi

-Commander (người chỉ huy) là thành phần chịu trách nhiệm gọi lệnh và kích hoạt thực thi. Tham chiếu tới ICommand và có thể cấu để làm việc với các lệnh khác nhau 1 cách linh hoạt

4 Code

interface ICommand {
  execute(): void
  undo(): void
}

class TurnOffCommand implements ICommand {
    private readonly fan: Fan
    constructor(fan: Fan) {
        this.fan = fan
    }
    execute(): void {
        this.fan.turnOff()
    }
    undo(): void {
        this.fan.turnOn()
    }
}

class TurnOnCommand implements ICommand {
    private readonly fan: Fan
    constructor(fan: Fan) {
        this.fan = fan
    }
    execute(): void {
     this.fan.turnOn()
    }
    undo(): void {
        this.fan.turnOff()
    }
}

class Commander {
    private readonly turnOnCommand: ICommand
    private readonly turnOffCommand: ICommand
    constructor(turnOnCommand: ICommand, turnOffCommand: ICommand) {
        this.turnOffCommand = turnOffCommand
        this.turnOnCommand = turnOnCommand
    }
    public turnOnButtonClick(): void {
        this.turnOnCommand.execute()
    }
    public turnOffButtonClick(): void {
        this.turnOffCommand.execute()
    }
}

// receiver -> cái quạt điều khiển bởi Remote
class Fan {
    turnOn(): void {
        console.log('Turn On')
    }

    turnOff(): void {
        console.log('Turn Off')
    }
}

function main() {
    const fan = new Fan()

    const turnOffCommand = new TurnOffCommand(fan)
    const turnOnCommand = new TurnOnCommand(fan)

    const remote = new Commander(turnOnCommand, turnOffCommand)

    remote.turnOnButtonClick()
    remote.turnOffButtonClick()
}
main()

class Commander {
}

// receiver -> cái quạt điều khiển bởi Remote
class Fan {
}



Enter fullscreen mode Exit fullscreen mode

Top comments (0)