본문 바로가기
My Image
프로그래밍/Design_Pattern

[Design_Pattern] 탬플릿 콜백 패턴(Template Callback Pattern)

by Lim-Ky 2017. 8. 29.
반응형

안녕하세요. Limky 입니다. 

이번 시간엔 Strategy 전략 패턴에 이어 탬플릿 콜백 패턴(Template Callback Pattern)을 알아보겠습니다. 탬플릿 콜백 패턴(Template Callback Pattern)은 전략 패턴의 변형으로 DI (Dependency injection) 의존성 주입에서 사용하는 특별한 전략 패턴입니다. 탬플릿 콜백 패턴은 전략 패턴에 익명 내부 클래스를 가미해서 사용하는 방법입니다. 

 

전략 패턴을 혹시 모르시면 아래 글을 참고 하시면 됩니다.

2017/08/28 - [Design_Pattern] - [Design_Pattern] 전략 패턴(Strategy Pattern)

 

 

자 바로 예제를 보겠습니다.

원래 기존 전략패턴에서 필요했던 구체클래스들은 StrategyGrenade.java, StrategyGun.java 였지만, 앞서 말했듯 익명 내부 클래스를 사용하기 때문에 필요가 없습니다. 

 

Strategy.java (전략 인터페이스 정의)

public interface Strategy {
	void runStrategy();
}

Solider.java(전략을 사용할 컨텍스트)

public class Solider {
	void runContext(Strategy strategy) {
		System.out.println("배틀 그라운드 시작");
		strategy.runStrategy();
		System.out.println("배틀 종료");
	}

}

ClientWithCallback.java(클라이언트에서 내부 익명 클래스를 통한 구체클래스 재정의)

public class ClinetWithCallback {

	public static void main(String[] args) {
		Solider rambo = new Solider();
	
		rambo.runContext(new Strategy() {
			
			@Override
			public void runStrategy() {
				System.out.println("템플릿 콜백버전: 탕! 타탕!! 탕탕탕!");
				
			}
		});
		
		System.out.println("\n");

		rambo.runContext(new Strategy() {
			
			@Override
			public void runStrategy() {
				System.out.println("템플릿 콜백버전: 수류탄 투척~! 쾅!!!");
				
			}
		});
		
	}

}
 

결과

배틀 그라운드 시작

템플릿 콜백버전: 탕! 타탕!! 탕탕탕!

배틀 종료

 

배틀 그라운드 시작

템플릿 콜백버전: 수류탄 투척~! 쾅!!!

 

배틀 종료

 

 

위 코드는 자세히 보면 ClientWithCallback.java에서 콜백을 통한 내부 익명 클래스 재정의를 하는 모습이 보입니다. 안드로이드개발을 많이 해보신 분들이라면 정말 익숙한 코드지요???

자 그건 그렇고, 하지만 중복되는 코드가 많이 보이기 때문에 Refactoring 해보겠습니다.

 

Strategy.java (전략 인터페이스 정의)

public interface Strategy {
	void runStrategy();
}
 

SoliderWithRefactoring.java(전략을 사용할 컨텍스트 + 내부 익명 클래스 이관 당함)

package TemplateCallbackPattern;

public class SoliderWithRefactoring {
	void runContext(String StrategySound) {
		System.out.println("배틀 그라운드 시작");
		execute(StrategySound).runStrategy();
		System.out.println("배틀 종료");
	}

	private Strategy execute(final String StrategySound) {
		return new Strategy() {
			
			@Override
			public void runStrategy() {
				System.out.println(StrategySound);
				
			}
		};
		
	}
}
 

Client.java(클라이언트 Solider안에 내부 익명 클래스를 이관했다. -> 코드가 깔끔해짐)

public class Client {

	public static void main(String[] args) {
		SoliderWithRefactoring rambo = new SoliderWithRefactoring();
		
		rambo.runContext("탕! 탕탕탕!");
		
		System.out.println("\n");
		
		rambo.runContext("수류탄 투척~! 쾅!!!");
		
	}

}
 
 

결과

배틀 그라운드 시작

템플릿 콜백버전: 탕! 타탕!! 탕탕탕!

배틀 종료

+

배틀 그라운드 시작

템플릿 콜백버전: 수류탄 투척~! 쾅!!!

배틀 종료

 
 
Solider 클래스 안에 콜백을 구현함으로써 Client쪽 소스가 깔끔해 졌습니다. 위와 같은 코드는 많이 사용하니 반드시 이해하고 알아둬야 합니다. 이렇듯 탬플릿 콜백 패턴(Template Callback Pattern)은 내부 익명 클래스를 가미한 전략 패턴이라고 생각하시면 됩니다. 마지막으로 탬플릿 콜백 패턴(Template Callback Pattern)은 OCP, DIP가 적용된 설계 패턴입니다.
 
 

 

반응형

댓글