커맨드 패턴 소개
- 예시: 음식 주문
- 고객이 종업원에게 주문을 합니다
- 종업원은 주문을 받아서 카운터에 전달하고 “주문 들어왔어요”라고 얘기합니다
- 주방장이 주문대로 음식을 준비합니다.
객체마을 식당 등장인물의 역할
- 주문서는 주문 내용을 캡슐화합니다.
- 주문서는 주문 내용을 요구하는 객체라고 볼 수 있습니다. 다른 객체와 마찬가지로 여기저기 전달될 수 있죠. 종업원이 주문서 객체를 계산대나 다른 종업원에게 전달해주는 식으로 말이죠. 이 객체의 인터페이스에는 식사 준비에 필요한 행동을 캡슐화한 orderUp() 메소드가 들어있습니다. 이게 유일한 메소드죠. 그리고 그 식사를 주문해야 하는 객체(주방장)의 레퍼런스도 들어있습니다. 이런 내용을 캡슐화되어 있어서 종업원은 어떤 메뉴가 주문되었는지, 누가 식사를 준비할 건지 등을 전혀 몰라도 됩니다. 그냥 이 주문서를 적당한 곳에 갖다주고 “주문 들어왔어요!”라고 한 마디만 해주면 되죠
- 종업원은 주문서를 받고 orderUp()메소드를 호출합니다.
- 종업원은 주문을 받고, 카운터로 가서 orderUp() 메소드를 호출해서 식사 준비를 요청하면 됩니다. 이미 언급했듯이 종업원은 주문서에 무슨 내용이 있는지, 누가 식사를 준비하는지는 전혀 걱정할 필요가 없습니다. 그냥 주문서에 orderUp() 메소드가 있으며, 그 메소드를 호출하면 식사가 준비된다는 것만 알고 있으면 되죠.
- 주방장은 식사를 준비하는 데 필요한 정보를 가지고 있습니다.
- 실제로 식사를 준비하는 방법은 주방장만 알고 있습니다. 종업원이 orderUp() 메소드를 호출하면 주방장이 그 주문을 받아서 음식을 만들 때 필요한 메소드를 전부 처리합니다. 여기서 주방장과 종업원은 완전히 분리되어 있습니다. 종업원은 각 주문서에 있는 메소드를 호출할 뿐이고, 주방장은 주문서로 할 일을 전달받습니다. 서로 직접 얘기할 필요가 전혀 없는거죠.
- 종업원 - 인보커 객체
- 주방장 - 리시버 객체
- orderUp() - execute()
- 주문서 - 커맨드 객체
- 고객 - 클라이언트 객체
- takeOrder() - setCommand()
커맨드 패턴의 정의
- 커맨드 패턴(Command Pattern)을 사용하면 요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화할 수 있습니다. 이러면 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있습니다.
- 커맨드 객체는 일련의 행동을 특정 리시버와 연결함으로써 요청을 캡슐화한 것입니다. 이러려면 행동과 리시버를 한 객체에 넣고, execute()라는 메소드 하나만 외부에 공개하는 방법을 써야 합니다.