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、封裝徹底,數據更安全
缺點:
策略如果過多,子類變得繁多
在最後的最後,筆者留給讀者一個思考,用抽象類代替接口,如何實現策略模式類似的結構代碼。並且思考抽象和接口的差別。