전략 패턴은 알고리즘들의 패밀리를 정의하고, 각 패밀리를 별도의 클래스(전략들, strategies)에 넣은 후 객체들을 상호교환할 수 있도록 하는 행동 디자인 패턴으로 클라이언트는 다양한 전략 중 하나를 선택, 생성 후 컨텍스트에 주입한다.
군인과 군인이 사용할 무기가 있다. 그리고 보급 장교가 군인에게 무기를 지급하면 군인은 지급 받은 무기에 따라 전투를 수행한다.
위 예시를 전략 패턴에 맞게 재정의 하면 아래와 같다.
우선 다양한 전략을 공통된 방식으로 사용하기 위해 인터페이스를 정의한다.
package strategyPattern;
public interface Strategy {
public abstract void runStrategy();
}
전략을 구현한다.
package strategyPattern;
public class StrategyGun implements Strategy{
@Override
public void runStrategy(){
System.out.println("탕, 타당, 타다당");
}
}
전략을 구현한다.
package strategyPattern;
public class StrategySword implements Strategy{
@Override
public void runStrategy(){
System.out.println("챙.. 채쟁쟁 챙챙");
}
}
전략을 구현한다.
package strategyPattern;
public class StrategyBow implements Strategy{
@Override
public void runStrategy(){
System.out.println("슝.. 쐐액.. 쉑, 최종 병기");
}
}
전략을 사용할 컨텍스트를 구현한다.
package strategyPattern;
public class Soldier {
void runContext(Strategy strategy){
System.out.println("전투 시작");
strategy.runStrategy();
System.out.println("전투 종료");
}
}
클라이언트는 다양한 전략 중 하나를 선택, 생성 후 컨텍스트에 주입한다.
package strategyPattern;
public class Client {
public static void main(String[] args) {
Strategy strategy = null;
Soldier rambo = new Soldier();
// 총을 람보에게 전달해 전투를 수행하게 한다.
strategy = new StrategyGun();
rambo.runContext(strategy);
System.out.println();
// 검을 람보에게 전달해서 전투를 수행하게 한다.
strategy = new StrategySword();
rambo.runContext(strategy);
System.out.println();
// 활을 람보에게 전달해서 전투를 수행하게 한다.
strategy = new StrategyBow();
rambo.runContext(strategy);
}
}
전투 시작
탕, 타당, 타다당
전투 종료
전투 시작
챙.. 채쟁쟁 챙챙
전투 종료
전투 시작
슝.. 쐐액.. 쉑, 최종 병기
전투 종료
디자인 패턴에 뛰어들기
스프링 입문을 위한 객체지향의 원리와 이해