객체의 행위(메서드)를 클래스로 만들어 캡슐화 하는 패턴
어떤 객체(A)에서 다른 객체(B)의 메서드를 실행하려면 객체(B)를 참조하고 있어야 하는 의존성이 발생한다.
이 같은 상황에서 커맨드 패턴을 적용하면 의존성을 제거할 수 있다.
또한 기능이 수정되거나 변경이 일어날 때 객체(A)의 코드를 수정없이 기능에 대한 클래스를 정의하면 되기 때문에 시스템이 확장성 있으면서 유연성을 가질 수 있다.
💠 클라이언트 - 커맨드 객체를 생성, 인보커 객체를 통해 리시버 객체에게 할 행동을 전달
💠 인보커 객체 - 커맨드를 저장함, 리시버 객체에게 행동을 전달하는 객체
💠 커맨드 객체 - 리시버 객체의 정보 + 행동이 들어있는 객체
💠 리시버 객체 - 행동을 하는 객체
💠 setCommand() - 인보커 객체에 정의되어 있는 메서드, 클라이언트가 실행한다. 이 메서드가 호출되면, 커맨드 객체가 같이 호출된다.
💠 execute() - 해당 호출로 커맨드 객체에 있는 일련의 과정들이 수행된다.
식당에서 주문을 하는 상황으로 예시를 들자면,
1. 손님이 웨이터에게 주문을 한다.
2. 웨이터가 고객의 주문을 주문서에 적는다.
3. 웨이터는 주문서를 주방에 전달해, 주문을 요청한다. (이 때 웨이터는 주문 내용은 알 필요가 없다.)
4. 요리사가 주문서를 받고 본인의 레시피를 통해 음식을 조리한다.
💠 클라이언트 - 손님
💠 웨이터 - 인보커 객체
💠 주문서 - 커맨드 객체
💠 주방장 - 리시버 객체
💠 setCommand() - 주문
💠 execute() - 주문서대로 실행하는 것
라고 생각하면 된다.