1. 의도
실행(런타임) 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 패턴
2. 용도
어떤 일을 수행하는 알고리즘이 여러가지 일때, 동작들을 미리 전략으로 정의함으로써 손쉽게 전략을 교체할 수 있는, 알고리즘 변형이 빈번하게 필요한 경우 적합
3. UML
4. 구현
템플릿 메서드와 비교하기 위해 동일한 예제로 진행한다.
public class CoffeeMaker {
private Coffee coffee;
public void setCoffee(Coffee coffee) {
this.coffee = coffee;
}
public void makeCoffee() {
boilWater();
putEspresso();
putIce();
coffee.makeCoffee();
}
private void boilWater() {
System.out.println("물을 끓인다.");
}
private void putEspresso() {
System.out.println("끓는 물에 에스프레소를 넣는다.");
}
private void putIce() {
System.out.println("얼음을 넣는다.");
}
public interface Coffee {
void makeCoffee();
}
public class IceAmericanoStrategy implements Coffee {
@Override
public void makeCoffee() {
System.out.println("시럽을 넣는다.");
}
}
public class IceLatteStrategy implements Coffee {
@Override
public void makeCoffee() {
System.out.println("우유를 넣는다.");
}
}
public class Client {
public static void main(String[] args) {
CoffeeMaker coffeeMaker = new CoffeeMaker();
coffeeMaker.setCoffee(new IceAmericanoStrategy());
coffeeMaker.makeCoffee();
System.out.println("======================");
coffeeMaker.setCoffee(new IceLatteStrategy());
coffeeMaker.makeCoffee();
}
}
/*
물을 끓인다.
끓는 물에 에스프레소를 넣는다.
얼음을 넣는다.
시럽을 넣는다.
======================
물을 끓인다.
끓는 물에 에스프레소를 넣는다.
얼음을 넣는다.
우유를 넣는다.
*/
Context에 전략을 세팅함으로써 다르게 동작하도록 할 수 있다.
5. 패턴의 장단점
- 장점
- 새로운 전략을 추가하더라도 기존 코드를 변경하지 않는다.
- 상속 대신 위임을 사용한다.
- 런타임에 전략을 변경할 수 있다.
- 단점
- 복잡도가 증가한다.
- 클라이언트가 구체적인 전략을 알아야한다.
출처 :
https://refactoring.guru/design-patterns/strategy
Strategy
The Strategy pattern lets you isolate the code, internal data, and dependencies of various algorithms from the rest of the code. Various clients get a simple interface to execute the algorithms and switch them at runtime. The Strategy pattern lets you do a
refactoring.guru
'디자인 패턴' 카테고리의 다른 글
자바(JAVA) - 커맨드(Command) 패턴 (0) | 2023.11.01 |
---|---|
자바(JAVA) - 데코레이터(Decorator) 패턴 (0) | 2023.10.19 |
자바(JAVA) - 빌더(Builder) 패턴 (0) | 2023.10.18 |
자바(JAVA) - 템플릿 메서드(Template Method) 패턴 (0) | 2023.10.13 |
자바(JAVA) - 싱글톤(Singleton) 패턴 (2) | 2023.10.12 |