이 포스트를 만든 목적
- Command 패턴을 이해 하는 것이다.
이 포스트의 준비물
- Firefox 3.6.10
- Winamp v.5.572 (x86)
- gVim 7.3
- gcc 4.5.0
참고 서적
- 안드레 알렉산드레스쿠 저. Modern C++ Design. 이기형 역.
Addiston-Wesley. 인포북. 초판 2003.07.30. page(177 ~ 180)
- Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Gof의 디자인 패턴. 김정아 역.
Addison-Wesley. 3쇄 2002.12.20. page(278 ~ 289)
- 장세찬 저. 디자인 패턴! 이렇게 활용한다.
한빛 미디어. 3쇄 2006.07.18. page(303 ~ 332)
내용
C++에서 Command 패턴이란 무엇인가?
- C++ 에서 호출 가능한 객체의 요청을 동일하게 캡슐화하기 위한 패턴이다.
- 책에 나온 내용을 그대로 적은건데, 이상하게 어렵다.
- 메세지와 이 메세지를 처리하는 객체를 쉽게 연결시키기 위한 패턴중 하나이다.
좀 풀어서 써야겠다. 인도영화 "못말리는 세친구 - 3idiots" 를 보면, 극 중 인물 란초가 "책"에 대해서 형이상적 언어로 표현하는 부분이 있는데, 간단하고 쉽게 쓰는게 제일 좋다는 것을 보았기 때문이다. 예를 들면 Command 패턴을 이렇게 표현할 수 있다.
- 내가 삼성동 수제비 식당에 들어갔다.
- 종업원이 무엇을 시킬지 물어 본다.
- 나는 바싹 익힌 자반 고등어, 임선임님은 매콤 달콤한 오징어 볶음, 강책임님은 짭짤한 황태구이를 주문한다.
- 종업원은 몇번 식탁에서, 어떤 주문을 받았는지 주문서에 적는다.
- 종업원은 주문서를 주방에가서 주방장에게 보여준다.
- 주방장은 주문서에 나와 있는 데로, 요리릴 시작한다.
- 주방장은 요리가 끝나자, 주문서를 보고, 몇번 테이블 무슨 음식 다 됬다고, 종업원에게 알려준다.
- 종업원은 주문서를 보고, 요리와 맞는지 확인하고, 주문한 식탁에 전달한다.
- 이것으로 모든 주문은 정상처리되어, 식당을 찾은 우리들은 점심을 맛나게 먹었다.
1 ~ 8 번의 과정은 Command 패턴을 몹시 잘 사용한 형태이다. 다음을 보자:
- 자반 고등어, 오징어 볶음, 황태구이가 실제로 만들어야 하는 일이다.
- 이것은 호출해야 하는 객체(음식들)을 주방장으로 부터 분리시킨 행위이다. 이렇게 한 이유는 종업원이 이 음식들을 만들수 없기 때문이다.
: Command 패턴의 한 부분인 호출 가능한 객체(음식)의 요청을 캡슐화한 것을 만족한다.
- 주문서에 적힌 내용을 실제로 일을 처리하는 주방장에게 전달했다.
- 주방장은 이 주문서를 보고, 자반 고등어를 만들라고 주방장 보조에게 시키고, 다른 요리들도 역시 각 주방장 보조에게 전달 할 것이다.(혹은 혼자 다 만들 수도 있다.) 이것은 요청이 전달 되었다는 것을 뜻한다
- 주방장은 "바싹 익힌", "매콤 달콤한", "짭짤한" 등을 보고, 거기에 맞게 조리를 한다.
- 이 의미는 자반 고등어 등의 주문마다 특정한 상태를 저장한 것이다.
: Command 패턴인 호출 가능한 객체(음식)의 요청을 잘 캡슐화 하였다는 뜻이다.
- 주방장에 의해 음식이 다 되었으면, 종업원은 주문서에 적힌 식탁으로 돌아가 음식을 건네준다.
- 이 의미는 단순히 황태 구이를 시킨다 하더라도, 황태 구이 마다 특정한 출처를 기록할 수 있다는 것을 의미한다.
: Command 패턴인 호출 가능한 객체(음식)의 요청을 매우 잘 캡슐화 하였다는 뜻이다.
실제로 이 패턴이 유용해지는 상황은 어디인가?
- 오늘 오전 10시에 삼성동 수제비 식당에 전화해, 오늘 오후 7시에 자반고등어를 요청 할때,
- 이런거 모르니까, 7시에 다시 전화해 라고 응대한다면, 망할 것이다. 그래서, 명령을 객체화 하여 저장해 두었다가 필요할 때, 수행하기 위해 Command 패턴을 사용하면, 무척 유용하게 사용할 수 있다.
: 요청한 시간과 처리될 시간이 다를 때
- 오늘 무슨 음식을 만들었었는지 기록할 때,
- 주방장에게 오늘 무슨 음식 기록했냐고 물어보면, 정신없어(어디서 체크 해야 하는지) 잘 모르기 때문에, 명령을 객체화 하여 기록하면 무척 유용하게 사용할 수 있다.
: 자기가 한일을 기록할 때
- 반드시 자반 고등어 다음에 황태구이를 요구하는 고객이 있을 경우,
- 이런거 안되니까, 안해줄꺼야 라고 응대한다면, 망할 것이다. 그래서, 주문서 하나를 순서대로만 처리하기 쉽기 때문에. 무척 유용하게 사용할 수 있다.
: 트랜잭션이 필요할 때
- 고객이 환불을 요구할 경우
- 이런거 안되니까, 안해줄꺼야 라고 응대하면, 영업 정지 당할 것이다. 그래서, 주문서를 보고, 손쉽게 환불 할 수 있다.
: Undo, Redo 기능이 필요할 때
여담
- 참고 서적을 형식에 맞추어 적어 봤다.
- 호출가능한 객체들을 저장하는 방법으로 함수자(함수 객체)를 사용하는게 편하다.
'책 정리 > Modern C++ Design' 카테고리의 다른 글
5장, 일반화 함수자(함수 객체) - 7. 총평 (0) | 2010.11.28 |
---|---|
5장, 일반화 함수자(함수 객체) - 6, 일반화 함수자 구현하기 - 멤버 함수 포함시키기 (0) | 2010.11.28 |
5장, 일반화 함수자(함수 객체) - 5, 일반화 함수자 구현하기 (0) | 2010.11.27 |
5장, 일반화 함수자(함수 객체) - 4, 일반화 함수자 구현하기 (0) | 2010.10.13 |
5장, 일반화 함수자(함수 객체) - 3, C++의 호출 가능한 객체들 (0) | 2010.10.09 |
5장, 일반화 함수자(함수 객체)와 Command 패턴 : 1 - 일반화 함수자는 무엇인가? (0) | 2010.09.29 |
4장, 작은 객체에 대한 메모리 할당 : 6 - 더 이야기 하고 싶은 메모리 풀 (1) | 2010.09.26 |
4장, 작은 객체에 대한 메모리 할당 : 5 - 메모리 풀에서 할당 기능을 어떻게 만들 것인가? (0) | 2010.09.25 |
4장, 작은 객체에 대한 메모리 할당 : 4 - 메모리 풀에서 할당 기능을 어떻게 만들 것인가? (1) | 2010.09.25 |
4장, 작은 객체에 대한 메모리 할당 - 3 : 메모리 풀에서 할당 기능을 어떻게 만들 것인가? (0) | 2010.09.25 |
최근댓글