什么是Strategy策略?
Strategy策略是定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。策略模式的主要目的是隔离算法。
Strategy策略的适用范围
许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法
需要使用一个算法的不同变体。
算法使用了客户不应该知道的数据。
一个类定义了多种行为,这些行为以条件语句的形式初夏,可以把相关的条件分支移入它们各自的Strategy类中,以代替这些条件语句。
具体的应用场合比如,打电话的时候,晚上通话的话话费打折,平时不打折,可以定义为不同的策略。
Strategy策略的示例
下面以时间不同,价格不同为例说明Strategy模式
import java.util.ArrayList;
import java.util.List;
// Sample Strategy design pattern
public class JavaApplication8 {
public static void main(String[] args){
Customer a = new Customer();
a.setStrategy(new NormalStrategy());
// Normal billing
a.add(1.2,1);
// Start Happy Hour
a.setStrategy(new HappyHourStrategy());
a.add(1.2,2);
// New Customer
Customer b = new Customer();
b.setStrategy(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() {
this.drinks = new ArrayList<Double>();
}
// Add items to tab
public void add(double price, int quantity){
drinks.add(price*quantity);
}
// Payment of bill
public void printBill(){
System.out.println("Total due: " + strategy.sum(drinks));
drinks.clear();
}
// Set Strategy
public void setStrategy(BillingStrategy strategy) {
this.strategy = strategy;
}
}
interface BillingStrategy{
// Return total price of drinks consumed
public double sum(List<Double> drinks);
}
// Normal billing strategy (unchanged price)
class NormalStrategy implements BillingStrategy{
public double sum(List<Double> drinks) {
double sum = 0;
for(Double i : drinks){
sum += i;
}
return sum;
}
}
// Strategy for Happy hour (10% discount)
class HappyHourStrategy implements BillingStrategy{
public double sum(List<Double> drinks) {
double sum = 0;
for(Double i : drinks){
sum += i;
}
return sum*0.9;
}
}