리셋 되지 말자

전략 패턴(Strategy Pattern) 2 본문

Java(폐지)/디자인 패턴

전략 패턴(Strategy Pattern) 2

kyeongjun-dev 2020. 8. 5. 16:23

전략 패턴의 구성요소


  • 전략 메서드를 가진 전략 객체
  • 전략 객체를 사용하는 컨텍스트(전략 객체의 사용자/소비자)
  • 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트(제3자, 전략 객체의 공급자)

클라이언트는 다양한 전략 중 하나를 선택해 생성한 후 컨텍스트에 주입한다.

예시 - 군인


군인과 군인 사용할 무기와 군인을 지휘하는 장교가 있다고 가정한다. 여기서는 군인이 컨텍스트, 무기가 전략 객체, 장교가 클라이언트다. 이를 코드로 나타내면 아래와 같다.

  • Strategy.java
package strategyPattern2;

public interface Strategy {
    public abstract void runStrategy();
}
  • StrategyGun.java
package strategyPattern2;

public class StrategyGun implements Strategy{
    public void runStrategy() {
        System.out.println("탕탕탕");
    }
}
  • StrategySword.java
package strategyPattern2;

public class StrategySword implements Strategy{
    public void runStrategy() {
        System.out.println("챙챙챙");
    }
}
  • StrategyBow.java
package strategyPattern2;

public class StrategyBow implements Strategy{
    public void runStrategy() {
        System.out.println("슈우우우웅");
    }
}
  • Soldier.java
package strategyPattern2;

public class Soldier {
    void runContext(Strategy strategy) {
        System.out.println("전투 시작");
        strategy.runStrategy();
        System.out.println("전투 종료");
    }
}
  • Client.java
package strategyPattern2;

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);

        System.out.println();
    }
}
  • 실행 결과
전투 시작
탕탕탕
전투 종료

전투 시작
챙챙챙
전투 종료

전투 시작
슈우우우웅
전투 종료

위처럼 전략 객체를 다양하게 변경해가면서 컨텍스트를 실행할 수 있다.
템플릿 메서드 패턴과 유사하다.
같은 문제의 해결책으로 상속을 이용하는 템플릿 메서드 패턴과 객체 주입을 이용하는 전략 패턴 중에서 선택/적용할 수 있다.
단일 상속만이 가능한 자바 언어에서는 상속이라는 제한이 있는 템플릿 메서드 패턴보다는 전략 패턴이 더 많이 활용된다.

  • 클라이언트가 전략을 생성해 전략을 실행할 컨텍스트에 주입하는 패턴
  • 개방 폐쇄 원칙(OCP)와 의존 역전 원칙(DIP)이 적용됨
Comments