1. 程式人生 > >【程式設計素質】設計模式-策略模式(Strategy,政策模式Policy)

【程式設計素質】設計模式-策略模式(Strategy,政策模式Policy)

1,概念

定義了演算法族,分別封裝起來,讓它們之間可以互相替換。

核心思想就是面向物件程式設計的多形性的思想.

是硬編碼(Hard Coding)的替換。如查詢、排序等,硬編碼是在一個類中,提供多個方法,每一個方法對應一個具體的查詢演算法。如果需要增加一種新的查詢演算法,需要修改封裝演算法類的原始碼;更換查詢演算法,也需要修改客戶端呼叫程式碼。在這個演算法類中封裝了大量查詢演算法,該類程式碼複雜,維護困難。如果我們將這些策略包含在客戶端,這種做法更不可取,將導致客戶端程式龐大而且難以維護,如果存在大量可供選擇的演算法時問題將變得更加嚴重。

2,場景

①許多相關的類僅僅是行為有異。 “策略”提供了一種用多個行為中的一個行為來配置一個類的方法。即一個系統需要動態地在幾種演算法中選擇一種。 ② 需要使用一個演算法的不同變體。 ③演算法使用客戶不應該知道的資料。 ④一個類定義了多種行為 , 這些行為以多個條件語句的形式出現。 例如,你可能會定義一些反映不同的空間 /時間權衡的演算法。當這些變體實現為一個演算法的類層次時 ,可以使用策略模式。 可使用策略模式以避免暴露覆雜的、與演算法相關的資料結構。 將相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。

3,優缺點

優:讓演算法的變化獨立於使用演算法的客戶。

4,實現

解決的是客戶端選擇方法的封裝方法(與之相比的是簡單工廠模式封裝的是物件),其實把簡單工廠模式稍作修改,就是策略模式了。可以認為是用簡單工廠模式返回了一系列有共同父類或者同一介面的物件,然後呼叫物件的介面或者虛方法。這樣客戶端程式碼只是通過工廠生成了一個物件,然後呼叫物件的方法,並通過多型來實現不同的程式功能。 這裡寫圖片描述

5,demo

package strategy;

public class Main {

    public static void main(String[] args){
        /*乘坐火車旅行*/
PersonContext person = new PersonContext(new TrainStrategy()); System.out.println( person.travel() ); /*乘飛機*/ person.setTravelStrategy(new AirPlanelStrategy()); System.out.println( person.travel() ); } } package strategy; public class PersonContext { private
TravelStrategy strategy= null; public PersonContext(TravelStrategy strategy){ this.strategy = strategy; } /** * 旅行 */ public void setTravelStrategy(TravelStrategy strategy){ this.strategy = strategy; } public String travel(){ return this.strategy.travelAlgorithm(); } } package strategy; /** * 抽象策略類(Strategy):定義所有支援的演算法的公共介面。 * Context使用這個介面來呼叫某ConcreteStrategy定義的演算法。 * @author luo * */ public interface TravelStrategy { public String travelAlgorithm(); } package strategy; /** * 具體策略類。實現Strategy介面。 * @author luo * */ public class AirPlanelStrategy implements TravelStrategy{ @Override public String travelAlgorithm(){ return "AirPlanelStrategy"; } } package strategy; /** * 具體策略類,實現Strategy介面 * @author luo * */ public class TrainStrategy implements TravelStrategy{ @Override public String travelAlgorithm(){ return "TrainStrategy"; } }