세줄 정리
- 상속을 통해 상위 클래스의 기능 확장할때 사용하는 대표적 방법
- 전체 흐름은 동일한데 일부 기능이 다른 경우, 템플릿 메서드 정의 후 상속받은 클래스에서 다른 메서드 정의
- 자바에서는 추상클래스를 사용해서 구현
예시
상황
- 손님이 결제를 할때 현금, 카드로 계산하는 경우
- 결제수단을 받아오고 돌려주는 방법은 똑같음
- 하지만 현금이냐, 카드냐 결제 하는 방법이 다름
추상클래스 Calculator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public abstract Calculator { // 탬플릿 메서드 public void pay(int price) { takePayment(); // 결제 수단 받아옴 doPayment(); // 결제 수행 returnPayment(); // 결제 수단 돌려줌 } protected void takePayment() { ... } protected void doPayment() { ... } // 클래스마다 달라지는 부분 protected abstract void doPayment(); } | cs |
클래스 CashCalculator
1 2 3 4 5 6 7 | public class CahCalculator extends Calculator { @Override protected void doPayment() { ... } } | cs |
특징
특징1. 부모 클래스가 흐름 제어
- 템플릿 메서드 패턴은 부모 클래스의 템플릿 메서드가 자식 클래스의 메서드를 호출
- 일반적인 경우, 자식 클래스가 흐름 제어(자식 클래스가 부모 클래스 기능 재사용할지 결정)
- 예시 : SuperCar 클래스의 turnOn() 메소드는 부모 클래스의 turnOn() 재사용 여부를 결정
1 2 3 4 5 6 7 | public class SuperCar extends ZetEngine { @Override public void turnOn() { if(notReady) beep(); else super.turnOn(); // 자식 클래스에서 부모 클래스 기능 재사용여부 결정 } } | cs |
특징2. 템플릿 메서드 접근제어자
- 템플릿 메서드 안에서, 자식 클래스마다 달라지는 메서드의 경우 하위 타입에서만 재정의 할수 있어야해서 protected 사용
특징 3. hook 메소드
- hook 메서드
- 부모클래스에서 default 기능을 정의해두거나, 비워둬서
- 자식클래스에서 오버라이드 하도록 만들어준 메소드
- 자식 클래스마다 달라지는 메서드의 경우, 기본구현을 제공할 수도 있고 안할수도 있는데
- 기본구현을 제공하는 메서드를 hook 메서드라고 함
자바에서 사용하는 경우 : AbstractMap<K,V> 클래스
- HashMap, TreeMap은 AbstractMap을 상속받아 구현하며
- AbstractMap(추상클래스)는 Map 인터페이스를 implements해서 get 메소드 구현해야함
- AbstractMap 상속받은 HashMap, TreeMap은 get() 메소드 가지지만 자신만의 구현방법으로 다르게 구현되어있음
출처
'객체 지향 프로그래밍 > 디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 상태 패턴(State Pattern) (0) | 2021.03.13 |
---|---|
[디자인 패턴] 전략 패턴(Strategy Pattern) (0) | 2021.03.13 |