
request)을 객체(object)로 캡슐화함으로써, 요청을 호출하는 쪽과 실행하는 쪽의 결합도를 낮추는 디자인 패턴이다.invoker)와 수신자(receiver)를 분리하고, 나중에 실행하거나 취소하거나 큐에 넣거나 기록할 수 있는 유연성을 제공한다.command)을 큐에 넣는다거나, 지연 실행(delayed execution), 혹은 실행 취소(undo) 기능이 필요할 때 유용하다.
Invoker (호출자 역할)
command)를 받아서 execute() 같은 메서드를 호출하여 실제 명령을 실행하는 쪽.Command 객체(인터페이스/추상)
execute 등)를 정의. 구체 명령(concrete command)들은 이 인터페이스를 구현하여 실제 로직과 수신자(receiver)를 알고 있음.Receiver (수신자 역할)
delegate)해서 작업을 실행함.Client (요청 생성자)
invoker)에 넘기는 쪽클라이언트가 수행될 작업(task)을 가지고 어떤 커맨드 객체(concrete command)를 생성한다.
명령 객체에는 수신자(receiver)와 실행할 행동(execute) 또는 필요한 인자(arguments)가 포함된다.
클라이언트는 인자로 커맨드 객체를 호출자(invoker)에 전달하거나 저장한다.
호출자(invoker)는 execute() 메서드를 호출하여 명령을 실행하며, 실제 작업은 수신자에게 위임된다.
필요하면 명령들을 큐에 쌓아 순차 실행하거나, 실행 취소(undo) 기능, 로그 기록 기능 등을 추가할 수 있다.
// Receiver: 실제 동작을 아는 객체
class TV {
turnOn() {
console.log("TV 켜짐 🔌");
}
turnOff() {
console.log("TV 꺼짐 ❌");
}
}
// Command 인터페이스 흉내 (execute 메서드만 있으면 됨)
class TurnOnCommand {
constructor(tv) {
this.tv = tv; // Receiver 주입
}
execute() {
this.tv.turnOn();
}
}
class TurnOffCommand {
constructor(tv) {
this.tv = tv;
}
execute() {
this.tv.turnOff();
}
}
// Invoker: 명령을 실행하는 역할
class RemoteControl {
submit(command) {
command.execute();
}
}
// Client: 어떤 명령을 쓸지 결정
const tv = new TV();
const remote = new RemoteControl();
const turnOn = new TurnOnCommand(tv);
const turnOff = new TurnOffCommand(tv);
remote.submit(turnOn); // "TV 켜짐 🔌"
remote.submit(turnOff); // "TV 꺼짐 ❌"