-
1. 템플릿 메소드 패턴 ( Template Method Pattern )DesignPattern 2018. 7. 18. 23:37반응형
다양한 디자인 패턴들이 존재하는데..
하나하나씩 정리해보자.~
1. 템플릿 메소드 패턴 ( Template Method Pattern )
- 상위 부모 클래스에서 작업에 대한 알고리즘을 정의하고 하위 자식 클래스에서 상세한 구현을 하도록 설계하는 패턴입니다.
- 템플릿 메소드 패턴은 매우 많이 쓰이는 패턴입니다. 아주 다양하고 다른 모양으로 구현하였기에 패턴이 적용되었는지 모를 수 있습니다.
- 프레임워크를 사용함으로써 작업이 처리되는 방식은 제어할 수 있으면서도, 프레임워크에서 처리하는 알고리즘의 각 단계는
프레임워크를 사용하는 사람 마음대로 지정할 수 있어 프레임워크를 만드는 데 아주 훌륭한 디자인 도구입니다.
2. 사용 예시
① CheezeBurger 와 ChikenBurger 의 두개의 클래스가 있습니다.
▶ 하지만 코드가 중복되어 있고, 두 클래스가 거의 비슷하니 공통적인 부분을 추상하여 베이스 클래스를 만들어야 합니다.
12345678910111213141516171819202122232425public class CheezeBurger {public void prepareBurger() {setBread();setBeefPatty();setCheeze();setVeggie();setSource();setSprite();}public void setBread() {System.out.println("빵을 내려놓는다");}public void setBeefPatty() {System.out.println("고기 패티를 넣는다.");}public void setCheeze() {System.out.println("치즈를 넣는다.");}public void setVeggie() {System.out.println("야채를 넣는다.");}public void setSource() {System.out.println("소스를 넣는다.");}public void setSprite() {System.out.println("스프라이트를 줍니다");}}cs 123456789101112131415161718192021public class ChickenBurger {public void prepareBurger() {setBread();setChickenPatty();setVeggie();setSource();setChicken();}public void setBread() {System.out.println("빵을 내려놓는다");}public void setChickenPatty() {System.out.println("치킨 패티를 넣는다.");}public void setVeggie() {System.out.println("야채를 넣는다.");}public void setSource() {System.out.println("소스를 넣는다.");}public void setCoke() {System.out.println("콜라를 줍니다");}}cs ② CheezeBurger와 ChickenBurger 클래스 사이에 공통된 부분을 생각해봅니다.
1) 빵을 내려놓는다.
2) 고기 또는 치킨 패티를 넣는다. -> 패티를 넣는다는 면에서 크게 다르지 않습니다.
3) 야채를 넣는다.
4) 소스를 넣는다.
5) 사이다 또는 콜라를 줍니다. -> 음료수를 주는 면에서 크게 다르지 않습니다.
③ prepareBurger() 메소드를 준비합니다.
▶ CheezeBurger 와 ChickenBurger를 만들 때와 똑같은 prepareBurger() 메소드를 사용합니다.
서브클래스에서 이 메소드를 오버라이딩해서 아무렇게나 음료를 만들지 못하도록 final로 선언합니다.
패티와 음료부분은 setPatty()와 setBeverage()라는 일반화된 메소드로 바꿉니다.
1234567final public void prepareBurger() {setBread();setPatty();setVeggie();setSource();setBeverage();}cs ④ Burger라는 부모 클래스를 만들었습니다.
▶ CheezeBurger와 ChickenBurger에서 setPatty(), setBeverage() 메소드를 서로 다른 방식으로 처리해야 하기 때문에 abstract로 선언하였습니다.
123456789101112131415161718192021222324public abstract class Burger {public void prepareBurger() {setBread();setPatty();setVeggie();setSource();setBeverage();}abstract public void setPatty();abstract public void setBeverage();public void setBread() {System.out.println("빵을 내려놓는다");}public void setVeggie() {System.out.println("야채를 넣는다.");}public void setSource() {System.out.println("소스를 넣는다.");}}cs ⑤ CheezeBurger와 ChickenBurger 클래스를 처리합니다.
▶ Buger클래스로부터 상속받습니다. 추상메소드인 setPatty(), setBeverage() 를 각 클래스에 맞게 정의하였습니다.
1234567891011121314public class CheezeBurger extends Burger{public void setCheeze() {System.out.println("치즈를 넣는다.");}@Overridepublic void setPatty() {System.out.println("고기 패티를 넣는다.");}@Overridepublic void setBeverage() {System.out.println("스프라이트를 줍니다");}}cs 123456789101112public class ChikenBurger extends Burger{@Overridepublic void setPatty() {System.out.println("치킨 패티를 넣는다.");}@Overridepublic void setBeverage() {System.out.println("콜라를 줍니다");}}cs ▶ main과 결과 화면
1234567891011121314public class TestBurger {public static void main(String[] args) {Burger[] burger = {new CheezeBurger(), new ChikenBurger()};for(int i=0; i<burger.length; i++) {if(burger[i] instanceof CheezeBurger) {((CheezeBurger)burger[i]).setCheeze();}burger[i].prepareBurger();System.out.println("-------------------------------");}}}cs ※ 정리
CheezeBurger 와 ChickenBurger는 조금의 차이는 있지만 만드는 방법은 사실상 똑같기 때문에 만드는 방법을 부모클래스에 일반화 시킵니다.
일반화시킨 Buger 클래스 안의 prepareBurger() 메소드는 템플릿 메소드입니다. 이 메소드는 햄버거를 만드는 알고리즘에 대한 템플릿 역할을 합니다.
템플릿 내에서 알고리즘의 각 단계는 메소드로 표현되구요, 각 메소드는 부모 클래스 혹은 자식클래스(abstract로 선언된 메서드)에서 처리됩니다.
** 템플릿 메소드 패턴의 장점
1) 부모클래스에서 작업을 처리하고 하나의 알고리즘을 가지고 있으며, 보완 및 수정이 쉽습니다.
2) 자식클래스에서 코드를 재사용할 수 있습니다.
3) 다른 자식클래스를 만들 때 쉽게 만들 수 있는 프레임워크를 제공하고 몇가지 메소드만 추가하면 됩니다.
반응형'DesignPattern' 카테고리의 다른 글
2. 싱글톤 패턴(Singleton Pattern) (0) 2018.07.23