flowchart TD
A[클라이언트] -->|createCommandObject with 리시버| B(커맨드)
B -->|setCommand| C[인보커]
C -->|execute| D(커맨드)
D -->|action1, action2| E[리시버]
예를 들어, 어떤 리모컨이 있고 그 리모컨에 전등을 등록하여 전등의 특정 기능(전등 켜기)를 실행시키는 커맨드 패턴을 구현해보겠다.
// 커맨드 인터페이스
public interface Command {
public void execute();
}
// 전등 켜기 명령을 담고있는 커맨드 클래스 구현
public class LightOnCommand implements Command {
// 실제 행동을 가지고 있는 리시버 객체를 변수로 선언
Light light;
public LightOnCommand(Light light) {
this.light = light;
}
@override
public void execute() {
light.on();
}
}
// 커맨드 객체 사용해보기
public class SimpleRemoteControl {
Command command
public SimpleRemoteControl() {}
public void setCommand(Command command) {
this.command = command;
}
public void buttonWasPressed() {
command.execute();
}
}
이렇게 커맨드 패턴을 사용하면 여러 요구 사항들을 객체로 캡슐화 할 수 있다.
뿐만 아니라 요청 내역을 큐에 저장하거나, 로그로 기록하는 등의 다양한 작업도 가능하다.
클래스 다이어그램
classDiagram
Command <-- ConcreteCommand
Receiver <|-- Client
ConcreteCommand <|-- Client
Command <|-- Invoker
class Client{
}
class Invoker{
setCommand()
}
class Command{
<<Interface>>
}
class Receiver{
action()
}
class ConcreteCommand {
execute()
undo()
}