본문 바로가기
Design Pattern

커맨드 패턴 (Command Pattern)

by 밍상 2023. 9. 27.

커맨드 패턴을 쓰면 작업을 요청하는 쪽과 그 작업을 처리하는 쪽을 분리할 수 있어요.

커맨드 객체를 추가해서 커맨드 객체는 틍정 작업 요청을 캡슐화해줍니다.

 

설명이 어려우니 일단 코드부터 봐볼까요?

 

//커맨드 인터페이스
public interface Command {
    void execute();
}
//조명을 켤 때 필요한 커맨드 클래스
public class LightOnCommand implements Command {
    Light light;

    public void lightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.on();
    }
}
//인보커(Invoker)
public class SimpleRemoteControl {
    Command slot;
    public SimpleRemoteControl() {}

    //제어할 명령을 설정하는 메소드
    public void setCommand(Command command){
        slot = command;
    }
    
    //버튼을 누르면 해당 메소드 호출
    public void buttonWasPressed() {
        slot.execute();
    }
}
public static void main(String[] args) {
        //remote 변수가 인보커(Invoker) 역할
        SimpleRemoteControl remote = new SimpleRemoteControl();
        Light light = new Light();
        LightOnCommand lightOn = new LightOnCommand(light);
        //커맨드 객체를 인보커에 전달
        remote.setCommand(lightOn);
        remote.buttonWasPressed();
}

커맨드 패턴을 사용하면

  • 요청 내역을 객체로 캡슐화해서 
  • 객체를 서로 다른 요청 내역에 따라 매개변수화할 수 있습니다.
  • 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있습니다.

제 식으로 간단하게 요약하면 어떤 클래스의 어떤 행동이던 특정 인터페이스에 할당해서 사용한다고 이해해도 될 것 같아요.

public class MacroCommand implements Command{
    Command[] commands;
    
    public MacroCommand(Command[] commands){
        this.commands = commands;
    }
    
    public void execute() {
        for (Command command : commands) {
            command.execute();
        }
    }
}

이렇게 여러 커맨드들을 하나의 매크로 커맨드로 묶어서 사용하는 방법도 있어요.

 

출처

에릭 프리먼, 엘리자베스 롭슨, 케이시 시에라, 버트 베이츠. 『헤드퍼스트 디자인패턴 개정판』. 한빛미디어, 2022