1 개요[ | ]
- strategy pattern, policy pattern
- strategy 패턴, 스트래티지 패턴, 전략 패턴, 정책 패턴
- 알고리즘을 교체할 수 있는 구조
- 동적으로 알고리즘을 교체할 수 있는 디자인 패턴
- 알고리즘을 사용하는 곳과, 알고리즘을 제공하는 곳을 분리시킨 구조
- 알고리즘 군을 정의하고, 각각 캡슐화하며, 교체가능하게 한다.
- 알고리즘 인터페이스를 정의하고 각 알고리즘들을 클래스별로 캡슐화하여 교체 가능하게 한다.
- 클라이언트가 사용할 때, 알고리즘을 독립적으로 변형시킬 수 있다.
- 변경이 필요한 알고리즘을 인터페이스를 통해 외부로 분리, 구체적 알고리즘 클래스를 필요에 따라 바꿔 사용할 수 있게 한다.
- 개방 폐쇄 원칙 실현에 가장 잘 맞는 패턴이다.
- 인터페이스명은 흔히 FooStrategy 또는 FooBehavior와 같은 형식으로 한다.
- 전략 패턴은 위임(delegation)을 통해 알고리즘 전체를 변경할 수 있는 반면, 템플릿 메소드 패턴은 상속(inheritance)을 통해 알고리즘 일부만 변형시킬 수 있다.
2 사례[ | ]
- 정렬 알고리즘 선택
- 결제방법 선택
3 예제[ | ]
Java
Copy
import java.util.ArrayList;
import java.util.List;
public class StrategyPatternWiki {
public static void main(String[] args) {
Customer a = new Customer(new NormalStrategy());
// Normal billing
a.add(1.0, 1);
// Start Happy Hour
a.setStrategy(new HappyHourStrategy());
a.add(1.0, 2);
// New Customer
Customer b = new Customer(new HappyHourStrategy());
b.add(0.8, 1);
// The Customer pays
a.printBill();
// End Happy Hour
b.setStrategy(new NormalStrategy());
b.add(1.3, 2);
b.add(2.5, 1);
b.printBill();
}
}
class Customer {
private List<Double> drinks;
private BillingStrategy strategy;
public Customer(BillingStrategy strategy) {
this.drinks = new ArrayList<Double>();
this.strategy = strategy;
}
public void add(double price, int quantity) {
drinks.add(strategy.getActPrice(price * quantity));
}
// Payment of bill
public void printBill() {
double sum = 0;
for (Double i : drinks) {
sum += i;
}
System.out.println("Total due: " + sum);
drinks.clear();
}
// Set Strategy
public void setStrategy(BillingStrategy strategy) {
this.strategy = strategy;
}
}
interface BillingStrategy {
public double getActPrice(double rawPrice);
}
// Normal billing strategy (unchanged price)
class NormalStrategy implements BillingStrategy {
@Override
public double getActPrice(double rawPrice) {
return rawPrice;
}
}
// Strategy for Happy hour (50% discount)
class HappyHourStrategy implements BillingStrategy {
@Override
public double getActPrice(double rawPrice) {
return rawPrice*0.5;
}
}
4 같이 보기[ | ]
5 참고[ | ]
편집자 Jmnote
로그인하시면 댓글을 쓸 수 있습니다.