커맨드 패턴이란?

요청을 객체의 형태로 캡슐화하여 사용자가 보낸 요청을 나중에 이용할 수 있도록

매서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 하는 패턴

HEAD FIRST DESIGN 에서…

커맨드 객체는 일련의 행동을 특정 리시버하고 연결시킴으로써 요구 사항을 캡슐화한 것이라는 점을 이미 배웠습니다.

이렇게 하기 위해서 행동과 리시버를 한 객체에 집어넣고, execute()라는 메소드 하나만 외부에 공개하는 방법을 씁니다.

이 메소드 호출에 의해서 리시버에서 일련의 작업이 처리됩니다.

외부에서 볼 때는 어떤 객체가 리시버 역할을 하는지, 그 리시버에서 실제로 어떤 일을 하는지 알 수 없습니다.

그냥 execute() 메소드를 호출하면 요구 사항이 처리된다는 것만 알 수 있을 뿐이죠.

구조

structure.png

  • Command
    실행될 기능에 대한 인터페이스
  • ConcreteCommand
    실제로 실행되는 기능을 구현
  • Invoker
    기능의 실행을 요청하는 호출자 클래스
  • Receiver
    ConcreteCommand에서 execute 메서드를 구현할 때 필요한 클래스

장점

  • 작업을 요청하는 클래스와 실제로 작업을 수행하는 클래스를 분리하여 시스템의 결합도를 낮출 수 있음

  • 기존 코드를 수정하지 않고 새로운 기능을 비교적 쉽게 추가할 수 있음

  • 동작자체를 객체화하여 일련의 트랜잭션을 객체단위로 제공할 수 있음

단점

  • 구현 및 유지보수해야 하는 클래스가 많아지게 됨.

참고