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

[Design_Pattern] 전략 패턴(Strategy Pattern)

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

안녕하세요 Limky입니다.

이번 시간은 전략 패턴(Strategy Pattern)에 대해서 알아보겠습니다.

디자인 패턴의 꽃이라고 할 정도로 전략 패턴(Strategy Pattern)은 꼭 기억해야 하는 중요한 패턴입니다. 먼저 전략 패턴(Strategy Pattern)을 구성하는 3가지 요소가 무엇인지 알아야 합니다.

 

1. 전략 메서드를 가진 전략 객체

2. 전략 객체를 사용하는 컨텍스트(전략 객체의 사용자/소비자)

3. 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트(제3자, 전략 객체의 공급자)

 

 

 

 

위 도식을 클래스 다이어그램으로 표현하면 다음과 같습니다.

 

 

 

 

클라이언트는 다향한 전략 중에 현재 상황에 적합한 전략을 생성해 컨텍스트에게 전략 객체를 주입합니다.  

즉 Strategy Interface를 구체클래스 여기선 전략들이 각자의 스타일에 맞게 구현합니다.

그다음 Context라는 소비자가 각각의 전략들을 사용하는 것이죠? 누구에 의해서? 클라이언트에 의해서입니다. 클래스 다이어그램에는 클라이언트는 보이지 않지만, 있다고 생각하면 됩니다.

 

제가 읽고 있는 스프링 입문을 위한 자바 객체지향의 원리와 이해에 나오는 예제를 가지고 설명해보겠습니다. 군대에서 현재 전쟁 중에 보급 대장이 k2소총이 유리하다고 판단해 k2소총을 생성하고 그 k2소총들을 군인들에게 나누어 주었습니다.

여기서 보급 대장은 클라이언트 역할이고 k2소총은 여러 전략 중 하나의 전략입니다. 그럼 군인들은 컨텍스트겠죠? 이를 코드로 한번 구현해보겠습니다.

 

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

public interface Strategy {
	void runStrategy();
}
 

StrategyGun.java (전략 인터페이스를 구현한 StrategyGun.java)

public class StrategyGun implements Strategy{

	@Override
	public void runStrategy() {
		// TODO Auto-generated method stub
		System.out.println("탕! 타탕! 탕탕!");
		
	}

}
 

StrategyGrenade.java (전략 인터페이스를 구현한 StrategyGrenade.java)

public class StrategyGrenade implements Strategy{

	@Override
	public void runStrategy() {
		// TODO Auto-generated method stub
		System.out.println("수류탄 투척~! 쾅!!!!");
		
	}

}
 

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

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

}
Client.java(전략을 생성하고 컨텍스트에게 주입시키는 클라이언트)
public class Client {

	public static void main(String[] args) {
		Strategy strategy = null;
		Solider rambo = new Solider();
		strategy = new StrategyGun();
		
		rambo.runContext(strategy);
		
		System.out.println("\n");
		strategy = new StrategyGrenade();
		
		rambo.runContext(strategy);
	}

}

 

*결과

배틀 그라운드 시작

탕! 타탕! 탕탕!

배틀 종료

 

배틀 그라운드 시작

수류탄 투척~! 쾅!!!!

 

배틀 종료

 
위 코드처럼 다양하게 전략을 변경하면서 컨텍스트에게 주입할 수 있습니다.
자세히 보면 템플릿 메서드 패턴과 유사할 겁니다. 즉 같은 문제의 해결책으로 상속을 이용하는 템플릿 메서드 패턴과 객체주입을 통한 전략패턴 중에서 선택하여 적용하시면 됩니다.
 
단일 상속만이 가능한 자바에서 상속이라는 제한이 있는 템플릿 메서드 패턴보다는 다양하게 많은 전략을 implements할 수 있는 전략패턴이 많이 사용됩니다.
 
전략 패턴을 한마디로 정리하면,
 
"클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에게 주입하는 패턴이다."
 
 
 

 

 

반응형

댓글