디자인 패턴 : 커맨드 패턴

DanChu 🌟·2022년 7월 20일
0

커맨드 패턴이란 요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록 매서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 하는 패턴

커맨드 패턴에는 아래 4개의 객체로 구분:

  • 명령(command)
  • 수신자(receiver)
  • 발동자(invoker)
  • 클라이언트(client)

커맨드 객체는 수신자 객체를 가지고 있으며, 수신자의 메서드를 호출하고, 이에 수신자는 자신에게 정의된 메서드를 수행.
커맨드 객체는 별도로 발동자 객체에 전달되어 명령을 발동하게 함.
발동자 객체는 필요에 따라 명령 발동에 대한 기록을 남길 수 있음. 한 발동자 객체에 다수의 커맨드 객체가 전달될 수 있음.
클라이언트 객체는 발동자 객체와 하나 이상의 커맨드 객체를 보유함. 클라이언트 객체는 어느 시점에서 어떤 명령을 수행할지를 결정한다. 명령을 수행하려면, 클라이언트 객체는 발동자 객체로 커맨드 객체를 전달한다.


커맨드 패턴 예시

리모컨에 불을 켜기 위한 버튼이 있고, 해당 기능을 구현

  1. 인터페이스 생성
public interface Command{
    public void execute();
}
  1. 불 켜기 위한 LightOnCommand 클래스 생성
    • 생성자 통해 light 객체 세팅
    • 불 켜기 위한 동작을 light.on으로 직접 수행하지 않도록 하기 위해 Command 인터페이스 구현 메소드인 execute 통해서 하도록 작성
public class LightOnCommand implements Command{
    Light light;
 
    public LightOnCommand(Light light){
        this.light = light;
    }
    
    public void execute(){
        light.on();
    }
 
}

execute 메소드 구현으로 외부에서 불 켜기 위해 light객체의 on을 반드시 알 필요 없어짐 -> execute()메소드 호출로 불 켜기 가능

  1. 명령 실행 위한 리모컨 클래스 (SimpleRemoteControl) 생성
public class SimpleRemoteControl{
    Command slot;
    
    public SimpleRemoteControl(){}
    
    public void setCommand(Command command){
        slot = command;
    }
 
    public void buttonWasPressed(){
        slot.execute();
    }
 
}

setCommand 통해서 명령 주입받음: LightOnCommand 의 인스턴스가 들어옴
외부에서 buttonWasPressed() 호출시, 주입받은 command 객체의 execute 메소드 실행

  1. 실행
public class RemoteControlTest{
    public static void main(String[] args){
        SimpleRemoteControl remote = new SimpleRemoteControl();
        Light light = new Light();
        LightOnCommand lightOn = new LightOnCommand(light);
 
        remote.setCommand(lightOn);
        remote.buttonWasPressed();
    }
 
}
  • SimpleRemoteControl을 인스턴스화
    - 사용가능한 리모컨을 하나 만들기

  • Light 클래스를 인스턴스화
    - 리모컨의 버튼에 의해 제어 될 전등을 선택함

  • LightOnCommand를 인스턴스화
    - Line4에 선택한 전등의 각종 기능을 실행할 수 있음. 아직은 전등 켜기 기능 밖에 없는 상태

  • 리모컨의 버튼에 Line5에서 만든 명령집을 주입

  • 리모컨의 버튼을 누른다.


출처 : https://soojong.tistory.com


커맨드 패턴의 장단점

장점

  • 발동자(invoker)와 수신사(receiver), 명령(command)가 각각 캡슐화되어 결합도가 낮아짐 -> 단일 책임 원칙에 부합
  • 코드 수정 없이 작업 수행 객체나 추가 구현이 가능 -> 개방-폐쇄 원칙에 부합
  • 커맨드 단위의 액션 가능

단점

  • 리시버 객체의 동작이 늘어날 때 마다 커맨드 클래스가 늘어남 -> 클래스가 늘어나 구조가 복잡

references

0개의 댓글