본문 바로가기

Java/DesignPattern

템플릿 메소드 패턴

만약에 여러 Controller 코드를 짜는데

1.초기화 - 정해져있는 코드

2.실행     - 매번 다르게 작성하는 코드

3.마무리 - 정해져있는 코드

라는 순서로 작성해야 한다

초기화, 마무리하는 코드는 고정된 코드이고, 실행하는 코드만 다르게 작성하고 싶을 때 어떻게 할까?

상속과 추상메소드를 이용하면 된다. 이를 이용한 것이 템플릿 메소드 패턴이다.

템플릿 메소드 패턴의 특징

1. 원하는 순서대로 코드가 실행되도록 강제할 수 있다. (아래의 execute()참고)

package com.example.fw;


public abstract class Controller2 {
    /**
     * 내가 가지고 있는 메소드를 호출하는데
     * 어떠한 순서를 가지고 있다
     * 이런 메소드를 템플릿 메소드라고 한다
     */
    public void execute(){
        // 정해진 순서대로 메소드를 실행한다
        this.init(); // this. 생략 가능
        this.run();
        this.close();
    }
    protected final void init(){
        System.out.println("초기화 하는 코드");
    }
    protected void close(){
        System.out.println("마무리 하는 코드");
    }
    protected abstract void run();

}

 

2. 만약에 사용자가 실수로 초기화하는 코드만 실행하는 경우가 일어나면 안된다.

즉, 사용자가 초기화 메서드를 직접 호출할 수 없어야한다.

-> protected 접근제한자 활용

protected 접근 제한자는 같은 package이거나 상속받았을 경우 접근 가능하다.

따라서 외부 package에서는 템플릿 메소드만 호출할 수 있게 강제할 수 있다.

*private 접근 제한자도 가능하다. 만약 init, close를 상속받은 클래스에서 별도로 호출하거나 초기화를 하고 싶은경우 protected 사용 추천. 

 

3. 만약에 init()가 Overide되면 자식 메소드가 무조건 실행됨 

-> final 키워드 사용해서 오버라이딩 못하게 막을 수 있다

 

예시)

package com.example.fw;

public abstract class Controller {
    // protected는 같은 package이거나 상속받았을 경우 접근 가능하다
    // execute만 호출하게 강제할 수 있다.
    // final 키워드 : 오버라이딩 금지
    protected final void init(){
        System.out.println("초기화 하는 코드");
    }
    protected void close(){
        System.out.println("마무리 하는 코드");
    }

    // 매번 다른코드. abstract로 지정해서 오버라이딩해서 사용하게 한다
    protected abstract void run();

    /**
     * 내가 가지고 있는 메소드를 호출하는데
     * 어떠한 순서를 가지고 있다
     * 이런 메소드를 템플릿 메소드라고 한다
     */
    public void execute(){
        // 정해진 순서대로 메소드를 실행한다
        this.init(); // this. 생략 가능
        this.run();
        this.close();
    }
}

 

이 추상 메소드를 상속받아서 실제로 사용할 클래스를 만든다

package com.example.myproject;

import com.example.fw.Controller;

// 매번 변하는 코드를 구현해준다
public class FirstController extends Controller {
    @Override
    protected void run() {
        System.out.println("매번 바뀌는 코드");
    }
}

 

main 메소드에서 다음과 같이 사용할 수 있다

package com.example.main;

import com.example.fw.Controller;
import com.example.myproject.FirstController;

public class ControllerMain {
    public static void main(String[] args) {
        Controller c1 = new FirstController();
        c1.execute();
        //c1.execute(); // 미리 정해진 순서대로 코드 실행
    }
}

 

실행결과

초기화 하는 코드
매번 바뀌는 코드
마무리 하는 코드

 

참고 : https://www.youtube.com/watch?v=-LZIyblqyWs&t=997s

 

'Java > DesignPattern' 카테고리의 다른 글

팩토리 메서드 패턴  (0) 2024.05.16
MVVM 패턴  (0) 2023.07.27