본문 바로가기
Programming/디자인 패턴

커맨드 패턴 (Command)

by Teshub 2021. 2. 9.

- 정의 -

요구사항(정보)을 객체로 캡슐화할 수 있으며 매개변수를 써서 여러 가지 다른 요구사항을 집어넣을 수도 있습니다.

또한 요청내역을 큐에 저장하거나 로그로 기록할 수 있으며 작업 취소 기능도 지원합니다.

 

인보커에는 execute() 메서드를 호출함으로써 커맨드 객체에게 특정 작업을 수행해달라는 요구를 하게 됩니다.

 

Command는 모든 커맨드 객체에서 구현해야 하는 인터페이스입니다. 모든 명령은 execute() 메서드 호출을 통해 수행되며 이 메서드에서는 리시버에 특정 작업을 처리하라는 지시를 전달합니다.

 

ConcreteCommand는 특정 행동과 리시버 사이를 연결하여 줍니다 인보커에서 execute() 호출을 통해 요청을 하면 ConcreteCommand 객체에서 리시버에 있는 메서드를 호출함으로써 작업을 처리합니다(리시버와 커맨드 객체를 이어주는 역할)

 

리시버는 요구사항을 수행하기 위해 어떤 일을 처리해야 하는지 알고 있는 객체입니다.

 

아주 간단한 테스트 코드입니다

 

public interface Command {
    public void execute();
}


public class Light {
    public void on(){
        System.out.println("Light on");
    }
    public void off() {
        System.out.println("Light off");
    }
}


public class LightOnCommand implements Command{

    Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }
    @Override
    public void execute() {
        light.on();
    }
}


public class SimpleRemoteControl {

    Command slot;

    public SimpleRemoteControl () {}

    public void setCommand(Command command){
        slot = command;
    }

    public void buttonWasPressed() {
        slot.execute();
    }

}

 

커맨드 객체의 가장 간단한 예제입니다 다이어그램의 실행구조정도의 예제라고 보시면 됩니다

테스트 코드입니다

public class testCode {
    public static void main(String[] args) {
        SimpleRemoteControl remote = new SimpleRemoteControl();
        Light light = new Light();
        LightOnCommand lightOn = new LightOnCommand(light);

        remote.setCommand(lightOn);
        remote.buttonWasPressed();
    }
}

 

버튼을 누를 시 정상적으로 요청이 실행이 됩니다

 

이상입니다

 

728x90

댓글