Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Exception
- SpringBoot
- 인프런
- springdatajpa
- Proxy
- 스프링 핵심 기능
- Spring Boot
- 백준
- Thymeleaf
- JPQL
- Servlet
- 스프링
- 그리디
- spring
- 스프링 핵심 원리
- jpa
- Android
- 자바
- 김영한
- 알고리즘
- QueryDSL
- http
- transaction
- Greedy
- pointcut
- AOP
- db
- JDBC
- java
- kotlin
Archives
- Today
- Total
개발자되기 프로젝트
하위 클래스 위임 - Template Method 본문
1. Template Method Pattern??
- 상위 클래스에서는 전체적인 흐름을 구현하고 구체적인 처리는 하위 클래스에 위임.
2. 의도와 동기
- Operation에 알고리즘의 기본 골격 구조를 정의하고, 구체적인 단계는 서브클래스에서 정의한다.
--> 프레임워크에서 자주 쓰는 이유 - 추상화된 함수를 통해서 알고리즘의 일부 단계를 정의함으로써 template method의 처리 순서를 정할 수 있다.
3. Class Diagram
4. 객체 협력 (collaborations)
- AbstractClass
- 서브 클래스들이 반드시 구현해야 하는 알고리즘 처리 단계 내의 기본 오퍼레이션이 무엇인지를 정의한다.
- 서브 클래스에서 이들 오퍼레이션들을 구현한다.
- ConcreteClass
- 상위 클래스에서 선언된 추상 메서드를 구현하거나 이미 구현된 메서드를 재정의한다
5. 중요한 결론 (consequence)
- 템플릿 메소드는 코드 재사용을 위한 기본 기술
- 프레임워크에서 가장 많이 사용되는 패턴 중 하나
- 클래스의 공통부분을 분리하는 기능 제공
- 템플릿 메서드에서 사용하는 오퍼레이션들
- AbstractClass 에 정의된 오퍼레이션 중 구체적인 알고리즘을 가지고 있는 오퍼레이션
- 훅 오퍼레이션 : 부가적인 기능을 추가할 수 있다. 다만 필수는 아님
- 추상 클래스에 abstract로 메서드 선언 안하면 됨.
- 만약 abstract로 선언 하면 concrete class에서 반드시 구현해야 함.
- 기본 오퍼레이션으로 추상화된 오퍼레이션
- ConcreteClass 오퍼레이션이나 클라이언트 클래스에 정의된 오퍼레이션
6. 예제
- Player Level
- 추상 메서드를 선언하고 메서드의 흐름은 추상 클래스에서 정의함.
- 흐름은 구체 클래스에서 변경하지 못함.
- 다만 각 메서드의 구현은 구체 클래스에서 진행.
- fly()는 구체 클래스에서 구현할 수도 안할 수도 있는 메서드이다.
따라서 abstract로 선언하지 않는다. abstract로 선언하면 구체 클래스에서 반드시 구현해야 한다.
public abstract class PlayerLevel {
public abstract void run();
public abstract void jump();
public abstract void turn();
public abstract void showLevelMessage();
//hook operation
public void fly(){};
final public void go(int count){
run();
for (int i=0;i<count; i++){
jump();
}
turn();
}
}
- PlayerLevel 추상 클래스에서 선언한 추상 메서드를 구현.
public class BeginnerLevel extends PlayerLevel {
@Override
public void run() {
System.out.println("천천히 달려");
}
@Override
public void jump() {
System.out.println("점프는 아직..");
}
@Override
public void turn() {
System.out.println("turn도 아직..");
}
@Override
public void showLevelMessage() {
System.out.println("초보자...............");
}
}
- SuperLevel
- 해당 level에서만 fly를 구현.(훅 오퍼레이션)
public class SuperLevel extends PlayerLevel {
@Override
public void run() {
System.out.println("빨리 달려");
}
@Override
public void jump() {
System.out.println("점프 할 줄 알어.");
}
@Override
public void turn() {
System.out.println("turn도 할줄 알어");
}
@Override
public void showLevelMessage() {
System.out.println("Super...............");
}
@Override
public void fly() {
System.out.println("화성 갈끄니까");
}
}
- 사용
public class MainBoard {
public static void main(String[] args) {
Player player = new Player();
player.play(1);
System.out.println("==========");
PlayerLevel advancedLevel = new AdvancedLevel();
player.upgradeLevel(advancedLevel);
player.play(1);
System.out.println("==========");
PlayerLevel superLevel = new SuperLevel();
player.upgradeLevel(superLevel);
player.play(1);
System.out.println("==========");
}
}
초보자...............
천천히 달려
점프는 아직..
turn도 아직..
==========
Advanced...............
천천히 달려
점프 할 줄 알어.
turn도 아직..
==========
Super...............
빨리 달려
점프 할 줄 알어.
turn도 할줄 알어
==========
- 이처럼 Template Method Pattern은 추상 클래스에서 메서드의 처리 순서를 정의하고,
각 메서드는 하위 클래스에서 별도로 구현할 수 있다.
7. GitHub : 211107 Template Method Pattern
'Java > 디자인 패턴' 카테고리의 다른 글
기능의 선언과 구현을 분리 - Strategy Pattern (0) | 2021.11.08 |
---|---|
하위 클래스 위임 - Factory Method (0) | 2021.11.07 |
인스턴스 생성 패턴 - Builder Pattern (0) | 2021.11.06 |
인스턴스 생성 패턴 - Abstract Factory Pattern (0) | 2021.11.04 |
인스턴스 생성 패턴 - Prototype Pattern (0) | 2021.11.04 |
Comments