안녕하세요 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("배틀 종료");
}
}
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);
}
}
*결과
배틀 그라운드 시작
탕! 타탕! 탕탕!
배틀 종료
배틀 그라운드 시작
수류탄 투척~! 쾅!!!!
배틀 종료
'프로그래밍 > Design_Pattern' 카테고리의 다른 글
[Design_Pattern] 탬플릿 콜백 패턴(Template Callback Pattern) (2) | 2017.08.29 |
---|---|
[Design_Pattern] 팩토리 메서드 패턴(Factory Method Pattern) (4) | 2017.08.28 |
[Design_Pattern] 템플릿 메서드 패턴(Template Method Pattern) (3) | 2017.08.27 |
[Design_Pattern] 데코레이터 패턴(Decorator Pattern) (1) | 2017.08.25 |
[Design_Pattern] 프록시 패턴(Proxy Pattern) (4) | 2017.08.25 |
댓글