<디자인패턴입문> 3. Template Method 패턴
by BFine
www.yes24.com/Product/Goods/2918928
가. 무엇일까?
a. 이미 만들어진 틀
- 문구적인 예를 들면 템플릿은 문자 모양으로 구멍이 뚫려있는 얇은 플라스틱 판으로 문자를 따라 쓰는 것이 있다.
=> 펜으로 쓰면 펜으로 쓴 문자, 연필로 쓰면 연필로 쓴 문자 등 도구상관 없이 결과물은 같다.
b. 템플릿 메서드 패턴
- 구성
1. 상위 클래스쪽에 템플릿에 해당하는 메서드가 정의
2. 메서드 안에 추상 메서드가 사용
3. 추상메서드 구현은 하위 클래스!
- 서로 다른 하위클래스가 있다면 서로 다른 처리가 실행되지만 큰흐름은 상위 클래스에서 결정한대로 이루어짐
- 즉 상위 클래스에서 뼈대를 결정하고 하위클래스에서 구체적인 내용을 결정하는 디자인 패턴
나. 만들어본 예제
a. Abstract Class 역할
- AnimalDisplay는 추상클래스로 선언이고 display 메서드만 구현하고 있다.
- display 메서드에서 큰 흐름 쥐고 있는게 보인다.
- 이 클래스가 템플릿 메서드를 구현하고 있는 것을 알 수 있다.
public abstract class AnimalDisplay {
public abstract void before();
public abstract void content();
public abstract void after();
public final void display(){
before();
for (int i = 0; i < 3; i++) {
content();
}
after();
}
}
b. Concreate Class 역할
- CatPlay와 DogPlay는 AnimalDisplay를 상속받아 before, content, after를 구현하는 하위 클래스 이다.
- 틀은 같지만 각자 다른 작업을 가지고 있는 것을 볼 수 있다.
- Abstract Class의 추상메서드를 구체적으로 구현하며 역으로 Abstract Class에서 호출해 사용된다.
public class CatPlay extends AnimalDisplay{
private String name;
public CatPlay(String name) {
this.name = name;
}
@Override
public void before() {
System.out.println("---- 고양이 "+name+"에게 간식을 주는 중입니다. -----");
}
@Override
public void content() {
System.out.println("야옹~");
}
@Override
public void after() {
System.out.println("---- 고양이 "+name+"은 배가 부릅니다. -----");
}
}
public class DogPlay extends AnimalDisplay{
private String name;
public DogPlay(String name) {
this.name = name;
}
@Override
public void before() {
System.out.println("---- 강아지 "+name+"와 산책중입니다 -----");
}
@Override
public void content() {
System.out.println("멍멍~");
}
@Override
public void after() {
System.out.println("---- 강아지 "+name+"와 산책이 끝났습니다. -----");
}
}
c. Main
- 구현체를 다르게 사용되었지만 실제 호출은 AnimalDisplay의 display가 호출된 것을 알 수 있다.
public static void main(String[] args) {
AnimalDisplay dog = new DogPlay("코니");
AnimalDisplay cat = new CatPlay("저스틴");
dog.display();
cat.display();
}
출력:
---- 강아지 코니와 산책중입니다 -----
멍멍~
멍멍~
멍멍~
---- 강아지 코니와 산책이 끝났습니다. -----
---- 고양이 저스틴에게 간식을 주는 중입니다. -----
야옹~
야옹~
야옹~
---- 고양이 저스틴은 배가 부릅니다. -----
다. 특징
a. 장점
1. 로직을 공통화 할 수 있다.
2. 하위 클래스를 상위 클래스와 동일시 한다.
=> instanceof 등으로 하위 클래스의 종류를 특정하지 않고 로직 구현이 가능
b. 이 패턴에 생각
- 회사에 코드를 살펴보다보면 템플릿 메서드 패턴을 적용한 부분들이 좀 있는 것 같다. 흠 내생각에는
조금 불필요한 패턴이 아닌가라는 생각이 들기도 한다. 굳이 틀을 만들어서 할 필요가 있을까?
instanceof 의 경우 차라리 인터페이스로 만들어서 처리해도 문제 없을 것 같고 하나의 클래스안에서
로직의 흐름이 보이는게 더 좋지 않을까? 라는 생각이 딱 템플릿 패턴만 놓고 봤을때 느낌이다.
- 여기 의의에도 나와있는데 예전부터 추상클래스가 필요한가? 라는 의문의 있었는데 이 패턴을 통해
어떻게 사용할때 좋을지 알게된 것 같다.
'개발서적 > 디자인패턴입문' 카테고리의 다른 글
<디자인패턴입문> 6. Abstract Factory 패턴 (0) | 2021.04.26 |
---|---|
<디자인패턴입문> 5. Bridge 패턴 (0) | 2021.04.25 |
<디자인패턴입문> 4. Prototype 패턴 (0) | 2021.04.24 |
<디자인패턴입문> 2. Adapter 패턴 (0) | 2021.04.21 |
<디자인패턴입문> 1. Iterator 패턴 (0) | 2021.03.28 |
블로그의 정보
57개월 BackEnd
BFine