템플릿 메서드 패턴
-특정 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계의 수행 내용 변경
디자인 패턴이라 말하기 민망할 정도로 객체지향 언어로 개발하다보면 무의식 적으로 사용하는 패턴
- 알고리즘의 구조를 메서드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경없이 알고리즘을 재정의 하는 패턴
알고리즘이 단계별로 나누어 지거나 같은 역할을 하는 메서드가 여러곳에서 다른 형태로 사용이 필요한 경우 유용
추상클래스를 통해 템플릿을 제공하고 이를 상속받는 하위 클래스가 구체적인 로직 작성
> 추상클래스가 전체적인 골격 정의, 일부 로직은 하위 상속 클래스에서 구현
장단점
- 장점
1. 중복 코드를 줄임
2. 자식 클래스의 역할을 줄여 핵심 로직의 관리가 용이
3. 객체지향적인 코드 구현 가능
- 단점
1. 추상 메서드가 많아지면서 클래스 관리가 복잡해짐
2. 클래스간 관계가 꼬일 위험이 있음
사용 예시
package com.sparta.blog;
abstract class hanghae{
public void start_Session(){
open();
start();
member();
end();
}
public void open(){
System.out.println("세신에 입장합니다");
}
public void start(){
System.out.println("세션이 시작합니다");
}
public void end(){
System.out.println("세션이 끝났습니다");
}
abstract void member();
}
class ingwang extends hanghae{
@Override
public void member(){
System.out.println("인광님이 잠에 듭니다");
}
}
class eunsol extends hanghae{
@Override
public void member(){
System.out.println("은솔님이 잠에 듭니다");
}
}
class sandhoon extends hanghae{
@Override
public void member(){
System.out.println("상훈님이 잠에 듭니다");
}
}
class sanghyun extends hanghae{
@Override
public void member(){
System.out.println("상현님이 잠에 듭니다");
}
}
class kyuri extends hanghae{
@Override
public void member(){
System.out.println("규리님이 잠에 듭니다");
}
}
class soyoung extends hanghae{
@Override
public void member(){
System.out.println("소영님이 잠에 듭니다");
}
}
public class Main {
public static void main(String[] args) {
ingwang ingwang = new ingwang();
eunsol eunsol = new eunsol();
kyuri kyuri = new kyuri();
soyoung soyoung = new soyoung();
sandhoon sandhoon =new sandhoon();
sanghyun sanghyun = new sanghyun();
ingwang.start_Session();
System.out.println("-------------------------------------");
eunsol.start_Session();
System.out.println("-------------------------------------");
kyuri.start_Session();
System.out.println("-------------------------------------");
soyoung.start_Session();
System.out.println("-------------------------------------");
sandhoon.start_Session();
System.out.println("-------------------------------------");
sanghyun.start_Session();
}
}
실행 결과