객체지향 (OOP)/디자인 패턴

템플릿 메소드 패턴(template method pattern)

고인돌개발자 2021. 6. 29. 22:31

정의[위키피디아]

템플릿 메소드 패턴(template method pattern)은 소프트웨어 공학에서 동작 상의 알고리즘의 프로그램 뼈대를 정의하는 행위 디자인 패턴이다.[1] 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단계들을 다시 정의할 수 있게 해준다

 

템플릿 메소드 패턴 - 위키백과, 우리 모두의 백과사전

템플릿 메소드 패턴(template method pattern)은 소프트웨어 공학에서 동작 상의 알고리즘의 프로그램 뼈대를 정의하는 행위 디자인 패턴이다.[1] 알고리즘의 구조를 변경하지 않고 알고리즘의 특정 단

ko.wikipedia.org

 


예제를 보며 이해하기

 

<Class Uml>

 

 

1. Dog 와 Cat 클래스가 아래와 같이 존재한다.

   - 아래 2개의 클래스는 우는 소리 (멍멍 , 야옹 야옹)를 제외하고는 모두 동일하다.

     이럴경우 동일한것과 다른 부분을 구분하여 추상 클래스를 상속받도록 하면 공통 부분을 재사용 할 수 있다.

 

public class Dog  {	
	public void playWithOwner() {
		System.out.println("귀염둥이 이리온...");
		System.out.println("멍! 멍!");
		System.out.println("꼬리 살랑 살랑~");
		System.out.println("잘했어");
	}	
}


public class Cat{ 
	public void playWithOwner() {
		System.out.println("귀염둥이 이리온...");
		System.out.println("야옹! 야옹!");
		System.out.println("꼬리 살랑 살랑~");
		System.out.println("잘했어");
	}	
}

 

2. 추상클래스에 공통부분과 다른 부분을 별도의 메서드로 만든다.

   - 공통 부분을 메서드로 만들고, 다른 부분을 abstract 로 선언하여 반드시 사용하도록 강제한다.

public abstract class Animal {
	// 템플릿 메서드
	public void playWithOwner() {
		System.out.println("귀염둥이 이리온...");
		play();
		runSomething();
		System.out.println("잘했어");
	}

	// 추상 메서드
	abstract void play();

	// Hook(갈고리) 메서드
	void runSomething() {
		System.out.println("꼬리 살랑 살랑~");
	}
}

3. 위 추상 클래스 Animal 을 상속하여 Dog 와 Cat 을 재정의 한다.

public class Dog2 extends Animal {
	@Override
	// 추상 메서드 오버라이딩
	void play() {
		System.out.println("멍! 멍!");
	}

	@Override
	// Hook(갈고리) 메서드 오버라이딩
	void runSomething() {
		System.out.println("멍! 멍!~ 꼬리 살랑 살랑~");
	}
}


-------------------

public class Cat2 extends Animal {
	@Override
	// 추상 메서드 오버라이딩
	void play() {
		System.out.println("야옹~ 야옹~");
	}

	@Override
	// Hook(갈고리) 메서드 오버라이딩
	void runSomething() {
		System.out.println("야옹~ 야옹~ 꼬리 살랑 살랑~");
	}
}

4. Main()

public class Driver {
	public static void main(String[] args) {
		Animal bolt = new Dog2();
		Animal kitty = new Cat2();

		bolt.playWithOwner();

		System.out.println();
		System.out.println();

		kitty.playWithOwner();
	}
}

책에서의 정의 

- 상위 클래스에 공통 로직을 수행하는 템플릿 메서드와 하위 클래스에 오버라이딩을 강제하는 추상 메서드 또는 선택적으로 오버라이딩 할 수 있는 훅(Hook) 메서드를 두는 패턴을 템플릿 메서드 패턴이라고 한다. 

 

"상위 클래스의 견본 메서드에서 하위 클래스가 오버라이딩한 메서드를 호출하는 패턴"


참고서적 : 스프링 입문을 위하 자바 객체지향의 원리와 이해