본문 바로가기
기술면접/디자인 패턴

[디자인 패턴] 커맨드 패턴

by illlilillil 2022. 4. 5.

커맨드 패턴이란?


커맨드 패턴은 실행될 기능을 캡슐화하여 여러 기능이 가능하도록 재사용성이 높은 클래스 설계 패턴이다.

요청을 캡슐화해 호출자와 수신자를 분리하는 패턴

 

리모컨이 있어 버튼을 선택해야 한다고 가정해본다. 명령은 게임 관련 명령과 불 관련 명령이 있다.

Invoker는 Button이 되고, Receiver는 Game, Light가 된다.

Command 인터페이스를 선언해 캡슐화한다.

 

public class Button {
    private Stack<Command> commands = new Stack<>();

    public void press(Command command) {
        command.execute();
        commands.push(command);
    }

    public void undo() {
        if(!commands.isEmpty()) {
            Command pop = commands.pop();
            pop.undo();
        }
    }

    public static void main(String[] args) {
        Button button = new Button();
        button.press(new GameStartCommand(new Game()));
        button.press(new LightOnCommand(new Light()));
        button.undo();
        button.undo();
    }
}

public class Game {

    public void end() {
        System.out.println("게임을 종료합니다.");
    }

    public void start() {
        System.out.println("게임을 시작합니다.");
    }
}
public class Light {

    private boolean isOn;

    public void on() {
        System.out.println("불을 켭니다.");
        this.isOn = true;
    }
    public void off() {
        System.out.println("불을 끕니다.");
        this.isOn = false;
    }
}
public class GameCommand implements Command{
    private Game game;

    public GameCommand(Game game) {
        this.game = game;
    }

    @Override
    public void execute() {
        game.start();
    }

    @Override
    public void undo() {
        game.end();
    }
}
public class LightCommand implements Command {
    private Light light;

    public LightCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.on();
    }

    @Override
    public void undo() {
        light.off();
    }
}

 

장점

  • 기존 코드 수정하지 않고, 새 기능을 추가할 수 있다.
  • 호출자와 수신자와의 의존성이 제거된다.
  • 수신자의 코드가 변경되도 호출자는 변경되지 않는다.

 

단점

  • 클래스가 너무 많아질 수 있다.
  • 코드가 복잡해진다.

 

자바, 스프링에서 커맨드 패턴

  • 자바
    • Runnable
    • 람다
    • 메소드 레퍼런스
  • 스프링
    • SimpleJdbcInsert
    • SimpleJdbcCall

참고 자료

https://www.inflearn.com/course/디자인-패턴/dashboard

 

댓글