** 호출 캡슐화 **
한차원 높은 단계의 캡슐화 -
메소드 호출을 캡슐화한다. 메소드 호출을 캡슐화하면 계산 과정의 각 부분들을 결정화시킬 수 있기 때문에, 계산하는 코드를 호출한 객체에서는 어떤 식으로 일을 처리해야 하는지에 대해 전혀 신경 쓰지 않아도 된다. 그냥 결정화된 메소드를 호출해서 필요한 일만 잘 할 수 있으면 된다. 그 외에도 캡슐화된 메소드 호출을 로그 기록용으로 자장을 한다거나 취소 기능을 구현하기 위해 재사용하는 것과 같이 신기한 작업을 할 수도 있다.
커맨드 패턴과 유사한 형태의 실생활 패턴
고급 식당 운영 패턴
1. 고객이 웨이트리스한테 주문을 한다.
2. 주문서에 주문한 메뉴가 적힌다.
3. 웨이트리스는 주문서를 받아서 카운터에 갖다 주고는 "주문 받아요!" 라고 얘기 한다.
4. 주방장이 주문대로 음식을 준비한다.
이것을 분석해보면
① 주문서는 주문한 메뉴를 캡슐화 한다.
- 주문서는 주문한 메뉴를 요구하는 객체로 생각할 수 있다. 이 객체의 인터페이스에는 execute() 라는 행동을 캡슐화한 메소드가 들어있다 . 그리고 그 식사를 준비(실질적인 행동)해야 하는 객체(리시버)(주방장)에 대한 레퍼런스도 들어있다.
이런 내용은 캡슐화 되어 있기 때문에 웨이트리스는 어떤 내용이 주문되었는지, 누가 식사를 준비할지 등을 전혀 몰라도 된다. 그냥 이 주문서를 적당한 곳에 갖다 주고 "주문 들어왔어요!" 라고 한 마디만 하면 된다.
② 웨이트리스는 주문서를 받아서 거기에 있는 execute()메소드를 호출하는 일을 한다.
- 주문서를 받는다는 것은 setCommand() 메소드를 통해 행동을 캡슐화한 인터페이스를 구현한 클래스를 받는다는 말이다. 그리고 나서 받은 주문서의 execute() 메소드를 호출 할 뿐 이다.
③ 주방장은 식사를 준비하는 데 필요한 정보를 가지고 있다.
- 주방장은 실제적인 행동을 하는 리시버 클래스이다 . ①에서 '식사를 준비(실질적인 행동)해야 하는 객체(리시버)(주방장)에 대한 레퍼런스도 들어있다.' 라는 말의 의미를 잘 생각해보라. 웨이트리스가 execute()메소드를 호출하면 주방장이 그 주문을 받아서 음식을 만들기 위한 메소드를 전부 처리한다. 여기에서 주방장과 웨이트리스는 완전히 분리되어있다. 웨이트리스는 execute메소드를 호출할 뿐이고, 주방장은 주문서로부터 할 일을 전달 받는다.웨이트리스하고 직접 얘기를 할 필요가 전혀 없다.
웨이트리스 : "어머, 저는 요리는 안 해요. 그냥 '주문받아요!'라고 얘기만 할 뿐이죠."
주방장 : "웨이트리스는 저하고 아무 상관도 없어요. 사실 제 타입도 아니고요...."
continue...