設(shè)計模式系列--策略模式

策略模式概念

策略模式定義了一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換,策略模式讓算法獨立于使用它的客戶而獨立變化。策略模式使這些算法在客戶端調(diào)用它們的時候能夠互不影響地變化。

策略模式的意義

策略模式使開發(fā)人員能夠開發(fā)出由許多可替換的部分組成的軟件,并且各個部分之間是低耦合的關(guān)系。低耦合的特性使軟件具有更強(qiáng)的可擴(kuò)展性,易于維護(hù);更重要的是,它大大提高了軟件的可重用性。

策略模式中有三個對象

環(huán)境對象(Context):該類中實現(xiàn)了對抽象策略中定義的接口或者抽象類的引用。
抽象策略對象(Strategy):它可由接口或抽象類來實現(xiàn)。
具體策略對象(ConcreteStrategy):它封裝了實現(xiàn)同不功能的不同算法。
模型圖

653266-20160411193500488-751474718.jpg

策略模式的實現(xiàn)

1.對策略對象定義一個公共接口。
2.編寫策略類,該類實現(xiàn)了上面的公共接口。
3.在使用策略對象的類中保存一個對策略對象的引用。
4.在使用策略對象的類中,實現(xiàn)對策略對象的set和get方法或者使用構(gòu)造方法完成賦值。

具體代碼實現(xiàn)

定義一個接口( 抽象策略),定義一個方法用于對兩個整數(shù)進(jìn)行運(yùn)算

public interface Strategy {

    public abstract int calculate(int a, int b);
}

定義具體的算法類,實現(xiàn)兩個整數(shù)的加減乘除運(yùn)算,但是外部調(diào)用形式需要符合接口的定義

實現(xiàn)加法運(yùn)算

public class AddStrategy implements Strategy {

    @Override
    public int calculate(int a, int b) {

        return a + b;
    }

}

實現(xiàn)減法運(yùn)算

public class SubstractStrategy implements Strategy {

    @Override
    public int calculate(int a, int b) {

        return a - b;
    }


}

定義具體的環(huán)境角色,持有Strategy接口的引用,并且有g(shù)et和set方法可以完成策略更換。在環(huán)境角色中調(diào)用接口的方法完成動作。

public class StrategyContext {
    private Strategy strategy;

    public StrategyContext(Strategy strategy) {
        super();
        this.strategy = strategy;
    }

    public Strategy getStrategy() {
        return strategy;
    }

    public void setStrategy(Strategy strategy) {
        this.strategy = strategy;
    }

    public int calculate(int a, int b) {
        return strategy.calculate(a, b);
    }
}

這樣在調(diào)用時,只需向環(huán)境角色設(shè)置相應(yīng)的算法類,然后就可以得到相應(yīng)的結(jié)果。

        //加法
        StrategyContext context = new StrategyContext(new AddStrategy());
        System.out.println(context.calculate(10, 5));
        //減法
        StrategyContext context2 = new StrategyContext(new SubstractStrategy());
        System.out.println(context2.calculate(3, 2));

策略模式的缺點

1、客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。
這就意味著客戶端必須理解這些算法的區(qū)別,以便適時選擇恰當(dāng)?shù)乃惴悺?換言之,策略模式 只適用于 客戶端知道 所有的算法或行為的情況。

2、策略模式造成很多的策略類,每個具體策略類都會產(chǎn)生一個新類。
有時候可以通過把依賴于環(huán)境的狀態(tài)保存到客戶端里面,而將策略類設(shè)計成可共享的,這樣策略類實例可以 被不同 客戶端 使用。換言之,可以使用 享元模式 來減少對象的數(shù)量。

demo地址:https://github.com/cruiseliang/Strategy

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用、多...
    MinoyJet閱讀 4,093評論 1 15
  • 1 場景問題# 1.1 報價管理## 向客戶報價,對于銷售部門的人來講,這是一個非常重大、非常復(fù)雜的問題,對不同的...
    七寸知架構(gòu)閱讀 5,255評論 9 62
  • 1 場景問題 1.1 報價管理 向客戶報價,對于銷售部門的人來講,這是一個非常重大、非常復(fù)雜的問題,對不同的客戶要...
    4e70992f13e7閱讀 3,219評論 2 16
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • 前言 軟件開發(fā)中,經(jīng)常遇到一種情況:實現(xiàn)一個功能可以有多種算法或策略,我們根據(jù)實際情況選擇不同的算法或者策略來完成...
    linda_zhou閱讀 624評論 0 2

友情鏈接更多精彩內(nèi)容