정의[위키피디아]
전략 패턴(strategy pattern) 또는 정책 패턴(policy pattern)은 실행 중에 알고리즘을 선택할 수 있게 하는 행위 소프트웨어 디자인 패턴이다.
전략 패턴은
- 특정한 계열의 알고리즘들을 정의하고
- 각 알고리즘을 캡슐화하며
- 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다.
전략은 알고리즘을 사용하는 클라이언트와는 독립적으로 다양하게 만든다.[1]
전략은 유연하고 재사용 가능한 객체 지향 소프트웨어를 어떻게 설계하는지 기술하기 위해 디자인 패턴의 개념을
보급시킨 디자인 패턴(Gamma 등)이라는 영향력 있는 책에 포함된 패턴들 가운데 하나이다.
디자인 패턴의 꽃이라고 하는 전략패턴의 3가지 요소
- 전략 메서드를 가진 전략 객체
- 전략 객체를 사용하는 컨텍스트(전략 책체의 사용자/소비자)
- 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트(제3자. 전략 객체의 공급자)
예제를 보며 이해하기
군인이 있다.
군인이 사용할 무기가 있다.
보급장교가 무기를 군인에게 지급해주면 군인은 주어진 무기에 따라 전투를 수행한다.
여기엣 무기는 전략이 되고, 군인은 컨텍스트, 보급장교는 제3자 즉 클라이언트가 된다.
1. 전략 인터페이스 클래스
// 전략 인터페이스
public interface Strategy {
public abstract void runstrategy();
}
2. 전략 인터페이스 구현체들
// 전략 인터페이스를 구현
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("슝.. 쐐액.. 쉑, 최종 병기");
}
}
3. 구현체를 받아 사용할 군인(컨텍스트)
// 전략을 사용하는 컨텍스트(군인)
public class Soldier {
void runContext(Strategy strategy) {
System.out.println("전투 시작");
strategy.runstrategy();
System.out.println("전투 종료");
}
}
4. 마지막으로 무기를 군인에게 지급(주입) 해주는 보급장교(클라이언트, 제3자)
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)이 적용된다.
참고서적 : 스프링 입문을 위하 자바 객체지향의 원리와 이해
'객체지향 (OOP) > 디자인 패턴' 카테고리의 다른 글
템플릿 콜백 패턴 (Template Callback Pattern) (0) | 2021.07.01 |
---|---|
팩토리 메서드 패턴(Factory method pattern) (0) | 2021.06.30 |
템플릿 메소드 패턴(template method pattern) (0) | 2021.06.29 |
싱글톤 패턴(Singleton Pattern) (0) | 2021.06.28 |
데코레이터 패턴 (Decorator Pattern) (0) | 2021.06.28 |