[6단원]디자인 패턴 - 전략 패턴 (Strategy Pattern)

전략 패턴 ( Strategy Pattern )

정의

  • 알고리즘 군을 정의하고 각각을 캡슐화하여, 교환해서 사용할 수 있게 만듬.
  • 알고리즘을 사용하는 클라이언트과 독립적으로 알고리즘을 변경가능

구성요소

  1. 전략 객체
    • 실제 전략 메서드를 구현하는 객체
  1. 컨텍스트
    • 전략 객체를 사용하는 부분
    • 전략 객체의 사용자나 소비자 역할을 함.
  1. 클라이언트
    • 전략 객체를 생성하고 컨텍스트에 주입
    • 전략 객체 공급자.

코드예시

  1. 시나리오

    군인, 무기, 보급 장교

    • 무기 (전략): 실제 행동 (즉, 전략)을 나타냅니다. 예를 들면 총, 검, 활 등이 있습니다.
    • 군인 (컨텍스트): 무기 (전략)를 사용하여 전투를 수행합니다.
    • 보급 장교 (클라이언트): 군인에게 어떤 무기 (전략)를 선택하여 주입할지를 결정합니다.
public interface Strategy {
    public abstract void runStrategy();
}
  • 전략 인터페이스
    • 모든 무기(전략)가 공통으로 구현해야할 메서드 정의
public class StrategyBow implements Strategy {
    
    @Override
    public void runStrategy() {
        System.out.println("슝.. 쉑, 쉭, 쉑");
    }
}
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 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 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);
    }
    
}
  • 클라이언트
    • 어떤 무기(전략)를 군인(컨텍스트) 에게 주입할지 결정 후 전투 수행.

자바에서는 상속을 이용하는 템플릿 메서드 패턴보다 객체 주입을 통한 전략 패턴이 더 많이 활용됨.

  • 정리
    • 전략 패턴은 클라이언트가 전략을 생성하여 그것을 실행할 컨텍스트에 주입하는 패턴임.
    • 클래스 다이어그램을 통해 OCP ( 확장에 유연 ) 와 DIP (하위 가 상위를 대체가능) 가 적용됨을 확인가능


Uploaded by N2T