커맨드 패턴

ITKHJ·2023년 2월 28일
0

GoF의 디자인 패턴

목록 보기
7/16
post-thumbnail

커맨드 패턴

  • 요청을 캡슐화하여 호출자(invoker)와 수신자(receiver)를 분리하는 패턴
  • 요청을 처리하는 방법이 바뀌더라도 호출자의 코드는 변경되지 않는다.

※ 사용 이유

  • 코딩을 할때 중복이 되는 비슷한 코드가 생성되는 문제를 해결하기 위해 사용
  • 호출자(invoker)와 수신자(receiver)간의 관계가 타이트하게 엮여 있어서, 비효율적인 코딩이 됨

※ invoker : 커맨드를 참조하고 실행하는 역할
※ Command 인터페이스 : 여러 구체적인 커맨드들을 추상화 시켜놓은 인터페이스

button or myApp : invoker
light or game : receiver

※ 사용 예시

Command(interface)

  • 우선 커맨드 인터페이스를 생성하여 execute()를 만들어둔다.
    → 예시를 들기위해 Command 인터페이스를 생성하였지만 자바에서 사용하는 Runnable인터페이스를 사용해도 무방함

Button(class)

  • 커맨드를 실행만 함

LightOnCommand(class)

  • 작업을 하기 위해서 필요한 모든 요소들이 다 들어와야 함
  • 우리가 하는 단순한 예제에서는 light만 알고 있고, on을 호출한다거나 하는 동작을 알고 있으면 됨

LightOffCommand(class)

Button(class)

  • invoker 쪽의 코드를 건드릴 필요가 없다.

※ 이렇게 코드를 구성하면 이미 만들어져 있는 Command 인터페이스를 얼마든지 재사용할 수 있다.

  • 이전 코드의 경우는 구체적인 receiver에 해당하는 것을 직접사용하였기 때문에 모든 코드를 변경해야 했지만, 위와 같이 Command 패턴을 적용하면, Command만 변경하면 됨(변경의 여지가 축소됨)

※ 장점

  • 기존의 코드를 변경하지 않고 새로운 커맨드를 만들 수 있다.(OCP, 개방 폐쇄의 원칙)
  • 수신자의 코드가 변경되어도 호출자의 코드는 변경되지 않는다.(SRP, 단일 책임의 원칙)
  • 커맨드 객체를 로킹, DB에 저장, 네트워크로 전송하는 등 다양한 방법으로 활용할 수도 있다.

※ 단점

  • 코드가 복잡해지고 클래스가 많아진다.
profile
모든 업무 지식 작성하자!

0개의 댓글