策略模式

一. 定義:

    策略模式:定義一組算法,將每個算法都封裝起來,並且使他們之間可以互換。

    Context封裝角色:它也叫上下文角色,起承上啓下封裝作用,屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化;

    Strategy抽象策略角色:策略、算法家族的抽象,通常爲接口,定義每個策略或算法必須具有的方法和屬性。(AlgorithmInterface即運算法則)

    ConcreteStrategy具體策略角色:實現抽象策略的操作,該類含有具體的算法。

    策略模式的重點是封裝角色。它是借用了代理模式,它和代理模式的差別就是策略模式的封裝角色和被封裝的策略類不用是同一個接口。

    

public interface Strategy {
//策略模式的運算法則
public void doSomething();
}
public class Context {
//抽象策略
private Strategy strategy = null;
//構造函數設置具體策略
public Context(Strategy strategy) {
this.strategy = strategy;
}
//封裝後的策略方法
public void doAnything() {
this.strategy.doSomething();
}
}
public class ConcerteStrategy1 implements Strategy {
@Override
public void doSomething() {
System.out.println("具體策略1的運算法則");
}
}
public class ConcerteStrategy2 implements Strategy {
@Override
public void doSomething() {
System.out.println("具體策略2的運算法則");
}
}
public class Client {
public static void main(String[] args) {
//聲明一個具體的策略
Strategy strategy = new ConcerteStrategy1();
//聲明上下文對象
Context context = new Context(strategy);
//執行封裝後的方法
context.doAnything();
}
}

二. 策略模式優缺點:

    策略模式優點:

        -- 算法可以自由切換

        -- 避免使用多重條件判斷

        -- 擴展性好

    策略模式缺點:

        -- 策略類數量增多

        -- 所以策略類都需要對外暴露,暴露得越多以後的修改風險越大。

三. 策略模式的使用場景及注意事項

    1.使用場景:

        多個類只有在算法或行爲上稍有不同的場景

        算法需要自由切換的場景

        需要屏蔽算法規則的場景

    2.注意事項:

        一個策略家族的具體策略數量超過4個就需要考慮使用混合模式避免類膨脹。

四. 解決策略模式的缺陷

    增加一個映射配置文件,實現策略類的隱藏。使用枚舉對策略類進行映射處理,避免高層模塊直接訪問策略類,同時由工廠方法模式根據映射產生策略對象。


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