設計模式(21)——Strategy (策略)

什麼是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;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章