Android 策略模式

Android 設計模式demo索引 Android 23種設計模式

前言

策略模式的最多的被用在算法中。針對同一個功能有多種實現方式,比如排序算法。通常策略模式就是把同一個功能或算法等抽象爲一個接口方法。具體的實現用單獨的類implements這個接口來實現。這樣做的好處是OCP單一原則,可擴展、可維護性很高。

策略模式定義

對同一問題或方法的不同處理方式單獨封裝起來。

策略模式例子

最近房租漲的那麼猛,我們就寫一個計算不同地方的平均房租的例子。抽象出來的方法就是計算平均房租。
這裏的Calculation就是我們的計算策略

public interface Calculation {
    int calculationAverageRent();
}

然後我們算一下深圳和北京這兩個地方的平均房租。當然具體的算法肯定很複雜,這裏只是模擬就省略了。看代碼

public class ShenzhenAvaerageRent implements Calculation {
    @Override
    public int calculationAverageRent() {
        //這裏只是模擬,省略具體怎麼算的。
        return 3000;
    }
}

public class BeijingAverageRent implements Calculation {
    @Override
    public int calculationAverageRent() {
        //這裏只是模擬,省略具體怎麼算的。
        return 5000;
    }
}

我們分別寫了兩個不同的類,BeijingAverageRent和ShenzhenAvaerageRent來計算北京和深圳的平均房租,這樣都是計算平均房租,具體的複雜實現卻互不影響。然後寫一個具體的計算平均房租的類。

public class CalculationAverageRent {
    private Calculation calculation;

    public void setCalculation(Calculation calculation) {
        this.calculation = calculation;
    }

    public int getAverageRent() {
        return calculation.calculationAverageRent();
    }
}

至此策略模式的整個結構就呈現了。就是爲了把BeijingAverageRent和ShenzhenAvaerageRent這兩個具體的方法獨立出來。實現解耦。最後調用就很簡單了

ShenzhenAvaerageRent shenzhenAvaerageRent = new ShenzhenAvaerageRent();
BeijingAverageRent beijingAverageRent = new BeijingAverageRent();  
CalculationAverageRent calculationAverageRent = new CalculationAverageRent();

calculationAverageRent.setCalculation(shenzhenAvaerageRent);
int shenzhen = calculationAverageRent.getAverageRent();
        
calculationAverageRent.setCalculation(beijingAverageRent);
int beijing = calculationAverageRent.getAverageRent();

Log.d("Strategy","shenzhen average rent  = " + shenzhen);
Log.d("Strategy","beijing average rent  = " + beijing);

輸出

D/Strategy: shenzhen average rent  = 3000
D/Strategy: beijing average rent  = 5000

策略模式小結,爲啥使用策略模式

到這裏策略模式的例子就講完了,結構特別簡單,但它帶來的好處也很明顯,算法獨立,擴展,修改都很方便,俗稱採用不同的策略,由此策略模式名字由此而來。如果不用策略模式,你或許就直接定義兩個計算的類來實現,但是,你想想你在調用的時候,你只能是用if else 或者switch來選擇北京還是深圳,然後再去調用算法。顯然沒有策略模式的代碼優雅,且擴展性也沒這麼好。so,以後用起來吧。

結束語

策略模式多被用在算法中,用來分離算法,在相同的的行爲抽象下有不同的實現策略。是開閉原則的絕佳演示。
優點:
1、結構清晰,簡單直觀
2、擴展方便,耦合度低
3、封裝徹底,數據更安全
缺點:
策略如果過多,子類變得繁多

在最後的最後,筆者留給讀者一個思考,用抽象類代替接口,如何實現策略模式類似的結構代碼。並且思考抽象和接口的差別。

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