PSD( Private-Self-Development )

명령 패턴 본문

Backend/디자인패턴

명령 패턴

chjysm 2023. 5. 30. 17:28

명령 패턴? 

행동의 호출을 객체로 캡슐화하여 실행하는 행동 패턴이다.

Action Pattern 이나 Transaction Pattern 으로 도 불린다.

명령 패턴의 특징 

매개변수 

동작을 객체화하여 매개변수 형태로 전달한다.

전달 받은 객체를 바로 실행하는 것이 아니라 명령 객체로 프로퍼티에 저장한 후, 임의의 시점에서 일괄 실행한다. 

 

시점 제어

작업의 요청과 처리를 분리하고 요청하는 작업들을 객체로 캡슐화한다.

이러한 객체의 실제 동작과 호출 실행 부분을 분리하면 동작의 실행 시점을 제어 할 수 있다.

동작 객체를 저장해놓고 필요 시점에 별도로 실행하는 식( Java Transaction 의 동작 방식을 생각하면 된다. )

 

복구

동작 취소 처리를 할 수 있다.

 

저장

명령 실행 중 오류가 생기는 경우 해당 명령을 저장해 뒀다가 다시 실행하도록 할 수 있다.

 

명령 패턴의 구성 요소

  • 인터페이스 : 동일한 명령 구조 호출을 위해 사용 
  • 명령 : 명령으로 실행되는 실제 객체(명령 객체)
  • 리시버 : 실제 동작을 처리하는 객체 명령 객체에 의존성 주입되어 사용된다
  • 인보커 :  다수의 명령 객체들을 저장하고 관리하는 객체 

 

 명령 패턴 장점 

  • 단일 책임 원칙
  • 개방/폐쇄 원칙
  • 실행 취소/재시도 구현 가능
  • 작업 지연 실행 가능
  • 간단한 커맨드들의 집합으로 복잡한 커맨드 조합 가능 

 

명령 패턴 단점

  • 코드 복잡도 상승

 

명령 패턴의 구현

public interface Command {
    void execute();
}

public class Receiver {
    public void operation(){
        System.out.println("operation");
    }
}

public class Invoker {
    private final HashMap<String, Command> commands = new HashMap<String, Command>();

    public void setCommand(String key, Command command){
        commands.put(key, command);
    }

    public void executeCommand(String key){
        commands.get(key).execute();
    }
}

@AllArgsConstructor
public class ConcreteCommand1 implements Command{
    private Receiver receiver;

    @Override
    public void execute() {
        receiver.operation();
    }
}

@AllArgsConstructor
public class ConcreteCommand2 implements Command{

    @Override
    public void execute() {
        System.out.println("ConcreteCommand2");
    }
}

 

언제 사용해야 할까? 

  • 작업의 실행을 예약하거나, 작업들을 대기열에 넣거나 원격으로 실행하려는 경우 
  • 되돌릴 수 있는 작업을 구현해야 할 때

 


참조

https://refactoring.guru/ko/design-patterns/command

'Backend > 디자인패턴' 카테고리의 다른 글

책임 연쇄 패턴( 체인 패턴 )  (0) 2023.08.09
방문자 패턴  (0) 2023.05.31
플라이웨이트 패턴  (0) 2023.05.23
파사드 패턴  (0) 2023.05.23
장식자 패턴  (0) 2023.05.22