템플릿 메서드 패턴은 상위 클래스에서 처리의 흐름을 제어하며, 하위 클래스에서 처리의 내용을 구체화하는 것을 말한다. 코드의 중복을 줄이고, 리팩토링에 유리한 패턴으로 상속을 통한 확장 개발 방법으로써 많이 사용되는 패턴중에 하나이다. 즉 쉽게 말해 프로그램 흐름의 틀을 만드는 것이다.
템플릿 메서드 패턴을 이해하기 위해 먼저 Hook 메서드가 무엇인지 알아보자
훅(갈고리 : hook) 메서드란 ?
abstract 키워드를 붙이면 상속 받은 클래스는 반드시 해당 메소드를 구현해야 하지만 abstract 키워드를 붙이지 않고 훅 메소드로 만들면 반드시 구현할 필요가 없다. 상속 받은 클래스에서는 선택적으로 오버라이드할 수 있다.
아래 예제를 보면 speak() 메서드는 추상 클래스에서 구현이 되어 있기 때문에 추상클래스를 상속받은 클래스에서는 오버라이드 할 필요없이 바로 사용해도 된다. 아래 예제에서 훅 메서드는 speak()가 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | abstract class Man { abstract public void walk(); public void speak() { System.out.println("Speak!!"); } } class Male extends Man { @Override public void walk() { // TODO Auto-generated method stub System.out.println("걷는중"); } } |
훅 메서드에 대해서 간단히 작성해보았고.. 이제 다시 템플릿 메서드에 대한 예제를 아래 적어 보았다.
ktko는 커피와 차를 만들려고 한다. 커피와 홍차는 아래의 절차대로 만들어진다.
물을 넣고 끓인다. |
물을 넣고 끓인다. |
커피를 넣는다. |
티를 넣는다. |
휘젓는다. |
휘젓는다. |
커피를 마신다. |
차를 마신다. |
여기에서 공통되는 부분은 물을 넣고 끓인다. 그리고 휘젓는다가 잇고 차이점은 첨가물이 달라지고 마시는 결과물이 달라지게 된다. 결국 위의 차이점을 가지고 공통되는 부분을 정리해 보았더니 아래와 같이 나왔다.
물을 넣고 끓인다. |
첨가물을 넣는다. |
휘젓는다. |
음료를 마신다. |
공통되는 부분을 추상클래스인 Drink로 만들어 공통되는 부분과 아닌 부분을 분리하였고, 커피와 차는 추상클래스인 Drink를 상속받아 사용하고 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | abstract class Drink { protected String name; public void getDrink() { boil(); additives(); stir(); drink(); } //물을 끓이고. public void boil() { System.out.println("물을 끓입니다."); } //첨가물을 넣고. abstract public void additives(); //휘젓고. public void stir() { System.out.println("휘젓습니다."); } //마신다. abstract void drink(); } class Coffee extends Drink { public Coffee() { super.name = "커피"; } @Override public void additives() { // TODO Auto-generated method stub System.out.println(super.name + "을 추가합니다."); } @Override void drink() { // TODO Auto-generated method stub System.out.println(super.name + "을 마십니다."); } } class Tea extends Drink { public Tea() { super.name = "홍차"; } @Override public void additives() { // TODO Auto-generated method stub System.out.println(super.name + "을 추가합니다."); } @Override void drink() { // TODO Auto-generated method stub System.out.println(super.name + "을 마십니다."); } } public class TemplatePattern { public static void main(String[] args) { Tea tea = new Tea(); tea.getDrink(); Coffee coffee = new Coffee(); coffee.getDrink(); } } |
템플릿 메서드 패턴을 요약하자면 "상위 클래스의 견본 메서드에서 하위 클래스가 오버리이딩한 메서드를 호출하는 패턴"이라고 할 수 있다. 템플릿 메서드 패턴은 의존 역전 원칙(DIP)를 활용하고 있음을 알 수 있다. 템플릿 메서드 패턴은 추상 메소드와 훅 메소드를 적절히 사용해서 전체적인 알고리즘의 틀을 만들수 있다. 그 결과로 유연하게 기능을 변경할 수 있도록 하고자 할 때 사용하면 유용하다.
'자바 디자인 패턴' 카테고리의 다른 글
디자인 패턴 - 빌더 패턴(Build Pattern) (1) | 2018.10.16 |
---|---|
디자인 패턴 - 팩토리 메서드 패턴(Factory Method Pattern) (0) | 2018.10.15 |
디자인 패턴 - 싱글턴 패턴(Singleton Pattern) (0) | 2018.10.15 |
디자인 패턴 - 데코레이터 패턴(Decorator Pattern) (0) | 2018.10.12 |
디자인 패턴 - 프록시 패턴(Proxy Pattern) (0) | 2018.10.12 |