Hello

[디자인 패턴] - Command

by 볼빵빵오춘기

Command

요청을 객체로 캡슐화하여, 서로 다른 요청, 큐잉, 로깅, 실행 취소 등의 기능을 유연하게 처리할 수 있게 해주는 행동(Behavioral) 패턴이다.

즉, 명령을 객체화함으로써, 실행자(Invoker)와 수신자(Receiver)를 느슨하게 연결할 수 있다.

 

예시 코드

// Command 인터페이스
interface Command {
    void execute();
}

// Receiver (명령의 실제 수행자)
class Light {
    void on() {
        System.out.println("불을 켰습니다.");
    }

    void off() {
        System.out.println("불을 껐습니다.");
    }
}

// Concrete Command
class LightOnCommand implements Command {
    private Light light;

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

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

class LightOffCommand implements Command {
    private Light light;

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

    public void execute() {
        light.off();
    }
}

// Invoker (명령 실행을 요청하는 쪽)
class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void pressButton() {
        command.execute();
    }
}

// Client
public class CommandExample {
    public static void main(String[] args) {
        Light light = new Light();
        Command lightOn = new LightOnCommand(light);
        Command lightOff = new LightOffCommand(light);

        RemoteControl remote = new RemoteControl();

        remote.setCommand(lightOn);
        remote.pressButton(); // 불을 켰습니다.

        remote.setCommand(lightOff);
        remote.pressButton(); // 불을 껐습니다.
    }
}

 

Command 패턴의 장점

요청과 실행 분리

명령을 실행하는 객체와 실행되는 객체의 결합도를 낮춘다.

 

실행 취소(undo), redo 가능

명령을 저장하고 되돌릴 수 있다.

 

명령 기록(로깅) 가능

요청을 저장하고 나중에 다시 실행할 수 있다.

 

매크로(Command 묶기)

여러 명령을 하나의 명령으로 묶어 처리 가능하다.

 

클라이언트 코드를 단순화

명령 실행만 알면 되고, 어떻게 처리되는지는 몰라도 된다.

 

Command 패턴의 단점

클래스 수 증가

명령마다 클래스를 생성해야 하므로 코드가 많아진다.

 

복잡도 증가

단순한 작업에 사용하면 오히려 구조가 복잡해질 수 있다.

 

Command 패턴 언제 사용하나?

사용자의 요청을 큐에 저장하거나 나중에 실행하고 싶을 때

ex) UI의 버튼 클릭 처리, 리모컨 기능 등

 

실행 취소(Undo) 기능이 필요할 때

ex) 텍스트 편집기, 도형 편집기

 

로그에 요청 내역을 기록하고 싶을 때

ex) 서버 요청 처리 기록

 

클라이언트가 요청의 수신자나 실행 방법을 알 필요 없게 하고 싶을 때

ex) 실행 객체를 몰라도 명령을 실행 가능하게 하고 싶을 때

 

정리하자면

"요청을 객체화"하여 실행, 취소, 재실행 등을 유연하게 처리할 수 있게 해주는 패턴이다.

블로그의 정보

Hello 춘기's world

볼빵빵오춘기

활동하기