Template method 패턴 - 공통된 알고리즘 부분이 고정적일때 사용
기본 알고리즘 골격을 상위 클래스에서 갖도록 한다
한글 ,오피스 ,엑셀등의 문서를 여는 함수의 모듈 Open() 은 비슷하다 거의 똑같다고 볼 수도 있는데
이런 공통과정을 클래스에게 맏기는 패턴
ABC 를 상위클래스 하나의 정의에 의하여 공유하고 , 각
하위 응용 프로그램마다(서브클래스마다) 파일을 여는 과정을 새로 정의 하는 것
전체적인 알고리즘은 공유하고 각 세부사항 구현은 따로 구현 하는 방식
전반적인 알고리즘 구조를 공유하는 모든 클래스의 부모 클래스에 정의 해놓고
이 부모 클래스에 동일한 알고리즘 을 둔다 그다음 서브 클래스의 세부 알고리즘은 Overriding 되어 구현 한다
부모 A 클래스에서 virtual void OpenDocument(); 함수가 정의 하여 모든 응용프로그램에 대한 문서를 여는 공통 알고리즘으로
부모 에 정의 해 놓고
만약 A 클래스내의 OpenDocument 안에서 이파일은 열 수 있는 문서라는 것이 확인 되어 진다면 해당 응용프로그램에 대해서
문서를 열도록 한다
처음 생성 클래스를 서브 클래스로 만들어 부모 A 클래스로 업캐스팅 한다음 실행을 OpenDocument 를 불러주면
부모에만 이 함수가 있음으로 부모의 OpenDocument 를 불렀다가 나머지 실제 여는 부분은
Overriding 되어 있음으로 서브 클래스의 함수로 호출 되는 구조가 된다
이때 OpenDocument 멤버 함수를 Template Method 라 한다
Template method 패턴은 - 공통된 부분이 고정적일때 사용
-알고리즘 중 변하지 않는 부분을 한번만 구현해 둔다음 변할 수 있는 부분을 하위 클래스에 의해 구현 되도록 할때 사용
-하위 클래스 확장을 제어하고 싶을때 Template Method 패턴을 사용 할 수 있다
대부분 자식이 불린후 자식에서 부모를 부르는 연산 순서를 취하는데
자식에서 부모함수명에 대한 부모클래스명:: 을 빼 먹는 경우 함수명이 수행함수명과 동일한 경우 엉뚱한 결과를 낳을 수 있는데
이런 위험을 없애려면 Template method 패턴을 경우 먼저 함수를 부를때 부모를 먼저 부른 후
부모에서 수행해야할 연산을 먼저 수행한 후 자식에 대한 HookOperation() => (이 함수는 자식에 overriding 된 함수) 함수를 수행하면
자식의 HookOperation() 이 불리는 순서가 역순인
Hock 연산을 사용 할 수 있다
Strategy 패턴은 객채를 변경 시켜가며 변경되는 패턴이고
Template Method 는 상속 관계를 이용해서 알고리즘의 일부분을 변경 시켜주는 것
그리고 Template Method 패턴은 Factory Method 패턴을 사용 할대가 종종 있다(자주)
이때 이 함수들은 굳이 public 으로 둘 필요는 없다( 클라이언트로부터 제어 하기 위한 구조)
Template method 에 의해 불려지는 함수(연산) 들은 protected 로 제어될 수 있지만
Template method 는 virtual 로 선언되어져서는 안된다!!
Template method 안에서 불리는 기본연산(함수) 를 최대한 적게 정의 해야 되는데
기본 연산이 많아 질수록 overriding 해야 할 함수들이 많아짐으로 구현이 지저분해진다
네트웍에서
Mke request
send request
new response
Process message
등이 있을때
HTTP, FTP, SMTP 등등 에서
등에서 위의 대략 4가지는 공통적이다
즉 구체적인 구현은 달리질 수 있지만 전체적인 과정은 동일 할 경우
상위 ClientComunication 클래스를 두고
하위 HTTP ,FPT ,SMT 클래스를 두어
세부적으로 위 4개의 함수를 Overriding 하여 세부적으로 구현
또한
send request
new response
에 대한 ABC 구조를 따로 만들어 추가 할 수도 있다
'디자인패턴과방법론 > 디자인패턴' 카테고리의 다른 글
adapter 패턴 (0) | 2012.11.02 |
---|---|
visitor 패턴 (0) | 2012.11.02 |
strategy 패턴 (0) | 2012.11.02 |
state 패턴 (0) | 2012.11.02 |
Observer 패턴 (0) | 2012.11.02 |