본문
Strategy Pattern (전략 패턴)
프로그래밍/디자인패턴 2015. 8. 30. 20:58
반응형
클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴
전략 패턴을 구성하는 세 요소는 꼭 기억해둬야 한다.
a) 전략 메서드를 가진 전략 객체
b) 전략 객체를 사용하는 컨텍스트 (전략 객체의 사용자/소비자)
c) 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트 (제 3자, 전략 객체의 공급자)
군인이 있다고 상상해 보자. 그리고 그 군인이 사용할 무기가 있다고 하자. 보급 장교가 무기를 군인에게 지급해 주면 군인은 주어진 무기에 따라 전투를 수행하게 된다. 이 이야기를 전략 패턴에 따라 구분해 보면 무기는 전략이 되고, 군인은 컨텍스트, 보급 장교는 제3자, 즉 클라이언트가 된다.
💡 interface
public interface Strategy {
public abstract void runStrategy();
}
💡 source
public class StrategyGun implements Strategy {
@Override
public void runStrategy() {
System.out.println("탕 탕 탕 ");
}
}
public class StrategySword implements Strategy {
@Override
public void runStrategy() {
System.out.println("챙 챙 챙");
}
public class StrategyBow implements Strategy {
@Override
public void runStrategy() {
System.out.println("슈웅 쏴악");
}
}
public class Soldier {
void runContext(Strategy strategy) {
System.out.println("전투 시작");
strategy.runStrategy();
System.out.println("전투 종료");
}
}
public class Client {
public static void main(String[] args) {
Strategy strategy = null;
Soldier soldier = new Soldier();
// '총'을 군인에게 전달해서 전투를 수행하게 한다.
strategy = new StrategyGun();
soldier.runContext(strategy);
System.out.println();
// '검'을 군인에게 전달해서 전투를 수행하게 한다.
strategy = new StrategySword();
soldier.runContext(strategy);
System.out.println();
// '활'을 군인에게 전달해서 전투를 수행하게 한다.
strategy = new StrategyBow();
soldier.runContext(strategy);
}
}
💡 결과
전투 시작
탕 탕 탕
전투 종료
전투 시작
챙 챙 챙
전투 종료
전투 시작
슈웅 쏴악
전투 종료
위 코드처럼 전략을 다양하게 변경하면서 컨텍스트를 실행할 수 있다.
전략 패턴은 이미 밝힌대로 디자인 패턴의 꽃이라고 할 정도로 다양한 곳에서 다양한 문제 상황의 해결책으로 사용된다. 또한 단일 상속만이 가능한 자바 언어에서는 상속이라는 제한이 있는 템플릿 메서드 패턴보다 전략 패턴이 더 많이 활용된다.
반응형
댓글