文書の過去の版を表示しています。


the Definition of Command Pattern

커맨드 패턴의 정의는 다음과 같습니다.

커맨드 패턴 - 커맨드 패턴을 이용하면 요구 사항을 객체로 캡슐화할 수 있으며, 매개변수를
써서 여러 가지 다른 요구 사항을 집어 넣을 수도 있습니다. 또한 요청 내역을 큐에 저장하거
나 로그로 기록할 수도 있으며, 작업취소 기능도 지원 가능합니다.

하나씩 살펴볼까요? 커맨드 객체는 일련의 행동을 특정 리시버하고 연결시킴으로써 요구사항을 캡슐화한 것입니다. 이렇게 하기 위해서 행동과 리시버를 한 객체에 집어넣고, execute()라는 메소드 하나만, 외부에 공개하는 방법 을 씁니다. 이 메소드 호출에 의해서 리시버에서 일련의 작업이 처리됩니다. 외부에서 볼 때는 어떤 객체가 리시 버 역할을 하는지, 그 리시버에서 실제로 어떤 일을 하는지 알 수 없습니다. 그냥 execute() 메소드를 호출하면 요구 사항이 처리된다는 것만 알 수 있을 뿐이죠.

이제 커맨드 패턴의 클래스 다이어그램을 살펴보도록 하겠습니다.

Class Diagram

Command Pattern

Command Pattern의 예로서 가전제품을 조정 가능한 리모컨 API을 살표보도록 하겠습니다. 이왕이면 작업취소 기능까지 구현해보겠습니다.

Command class implements an undo function

커맨드에서 작업취소 기능을 지원하려면 execute()메소드하고 비슷한 undo()메소드가 있어야 합니다. execute()메소드에서 했던 것과 정 반대의 작업을 처리하면 되겠죠. 커맨드 클래스에 작업취소 기능을 추가하기 전에 우선 Command interface에 undo()메소드를 추가해야 됩니다.

public interface Command{
    public void execute();
    public void undo();
}

정말 간단하죠? 이제 Light 커맨드 클래스로 들어가서 undo() 메소드를 구현해 볼까요?

LightOnCommand부터 시작해 보죠. LightOnCommand()의 exeucte()메소드가 호출되어서 Light의 on()메소드가 호출되었다고 해 봅시다. 그러면 undo()메소드에서는 그 반대로 off()메소드를 호출해야 될 겁니다.

public class LightOnCommand implements Command{
  Light light;
 
  public LightOnCommand(Light light){
     this.light = light;
  }
 
  public void execute(){
     light.on();
  }
 
  public void undo(){
     light.off();
  }
}

QR Code
QR Code study:java:design_pattern:command (generated for current page)