상속받은 클래스에서 달라지는 부분을 자식에게 위임시킨다.
스트레티지 패턴이랑 비슷하며 알고리즘의 뼈대를 정의하고, 일부를 서브 클래스로 위임한다.
템플릿 메소드는 알고리즘의 구조를 변경하지 않고 알고리즘의 일부 내용을 서브 클래스에서 재정의 할 수 있도록 한다.
즉 알고리즘 과정의 일부를 정의하고 일부를 서브클래스로 위임하는 것이다. 틀의 일부를 타 사용자들이 고쳐쓸 수 있도록 하며 Framework 에서 많이 쓰는 패턴이다.
기존의 문제점은 알고리즘들을 캡슐화 시키면서 중복되는 코드가 여러 클래스에 존재한다는 것이었다.
(같은 알고리즘 코드가 여러군데에 있을 때)
해결방안은 알고리즘의 중복되는 부분을 부모 클래스에 추상화 시키고 달라지는 부분만 서브 클래스에서 구현하는 것이다. 부모를 추상화 하고 , 달라지는 걸 서브클래스에 넣는다.
결과는 중복되는 코드가 줄어들고, 유지보수가 유리해진다.
부모를 추상클래스로 만들어서 중복되는 부분을 빼고 바뀌는 부분은 추상 메소드로 돌려서 상속받는 자식 클래스에서 구현하도록 하자.
템플릿 메소드라는게 고정된 알고리즘을 짜주는 건데
public final void prepareRecipe(){
boilWater():
brew();
pourInCup();
addCondiments();
}
이거 자체가 템플릿 메소드이다. 전체 뼈대를 짜주고 abstract으로 선언해놓은 부분만 자식에게 위임되어 자식이 수행할 수 있도록 한다.
템플릿메소드는 알고리즘의 각 단계들을 정의하며, 그 중 한 개 이상의 단꼐가 서브클래스에 의해 제공될 수 있다.
기존에는 알고리즘이 바뀌면 서브클래스을 열어서 여러군데를 고쳤어야하는데 템플릿 메소드를 적용하면 알고리즘은 한 군데 모여있으므로 그 부분만 수정하면 된다.
알고리즘 부분에 hook를 추가할 수 있다.
사용자가 기본틀에 벗어나는 뭔가를 더 하고싶을 때 hook를 사용하면 된다.
사용자 키보드 입력을 받아서 hook를 이용해 사용자가 선택할 수 있게 만들어줄 수 있다.
hook는 메소드 알고리즘에서 선택적으로 적용되는 부분을 구현할 때에도 사용가능. (여러가지 목적으로 사용가능하다. )
헐리우드 원칙
템프릿 메소드를 이용해서 프로그램을 설계하면서 부모방향에서 자식을 부르고 자식방향에서 부모를 부르는 식으로 양방향으로 서로를 부른다면 복잡하기 때문에 부모가 기능을 구현하고 자식들은 부모가 자식을 호출할것이라는 걸 가정하고 구현된다. 즉 부모가 뼈대를 갖추고 , 부모가 필요할 때 자식을 호출한다.
스트레티지 패턴과 템플릿 메소드의 차이.
스트레티지패턴은 템플릿 메소드패턴과 비슷하지만 규모의 차이가 있다.
템플릿 메소드는 상속을 이용해서 알고리즘의 일부를 다른 클래스에 맡기고
스트래티지는 알고리즘 전체를 위임한다.
팩토리 메소드는 템플릿 메소드의 특화된 버전이기도 하다.
상속을 통한 제어 흐름 추상화
템플릿 메소드에서 알고리즘의 골격을 정의한다. 템플릿 메소드를 이용하면 알고리즘의 구조는 유지하면서 서브 클래스에서 특정 단계를 새로 정의 가능하다.
스트레티지는 알고리즘군을 정의하고 각각을 캡술화하여 교환해서 사용한다. (그렇기 때문에 Interface를 만들어 틀을 만들고 자식들이 이를 상속하여 구현하도록 했다. 그런 뒤 Interface를 쓰는 곳에 상속받은 자식을 집어넣는 방식으로 사용했다. ) 그래서 알고리즘을 사용하는 클라이언트는 Interace만 알고 Interface를 상속받은 자식들의 내용은 모른다. 그냥 클라이언트에 집어넣기 때문이다. )
'디자인 패턴 DesignPattern' 카테고리의 다른 글
스테이트 패턴(State Pattern) (0) | 2020.12.08 |
---|---|
07.Singleton Pattern (0) | 2020.10.14 |
댓글