전략 패턴 ( Strategy Pattern )
정의
- 알고리즘 군을 정의하고 각각을 캡슐화하여, 교환해서 사용할 수 있게 만듬.
- 알고리즘을 사용하는 클라이언트과 독립적으로 알고리즘을 변경가능
구성요소
- 전략 객체
- 실제 전략 메서드를 구현하는 객체
- 컨텍스트
- 전략 객체를 사용하는 부분
- 전략 객체의 사용자나 소비자 역할을 함.
- 클라이언트
- 전략 객체를 생성하고 컨텍스트에 주입
- 전략 객체 공급자.
코드예시
- 시나리오
군인, 무기, 보급 장교
- 무기 (전략): 실제 행동 (즉, 전략)을 나타냅니다. 예를 들면 총, 검, 활 등이 있습니다.
- 군인 (컨텍스트): 무기 (전략)를 사용하여 전투를 수행합니다.
- 보급 장교 (클라이언트): 군인에게 어떤 무기 (전략)를 선택하여 주입할지를 결정합니다.
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
'자바 > 스프링입문객체지향' 카테고리의 다른 글
[디자인패턴] 생성 패턴 - 팩토리 메서드 (0) | 2023.10.07 |
---|---|
[6단원]디자인 패턴 - 프록시 패턴 추가예제 (0) | 2023.10.01 |
[6단원]디자인 패턴 - 템플릿 콜백 패턴(Template Callback Pattern - 견본/회신 패턴) (0) | 2023.09.23 |
[6단원]디자인 패턴 - 싱글턴 패턴 (Singleton Pattern) (0) | 2023.09.21 |
[6단원]디자인 패턴 - 템플릿 메서드 패턴 ( Template Method Pattern) (0) | 2023.09.21 |