1.什么是Strategy模式(策略模式)
???策略模式,舉個現實應用開發的例子:在我們的程序設計中,如果需要提供多種排序算法(冒泡排序、二分法排序、歸并排序、插入排序等等),有一種想法我們可以將所有排序方法作為靜態方法統一封裝到一個類里面,當我們要使用具體哪個方法的時候通過傳入標志位,通過if...else...這種形式確定判斷調用哪個排序算法。
???對于這種方法,優點在于只需要一個類文件即可以解決調用問題。缺點在于通過if..else..這種判斷方法屬于硬編碼實現方式,如果在該類中存在多種排序算法,則會造成臃腫的現象,可維護性差,并且當我們要新增一個排序算法的時候,我們要重新修改算法類的源代碼,明顯也違法了我們程序設計的ocp原則和單一職責原則。
???<b>解決思路</b>:如果我們將每個算法策略抽象出來,提供一個當獨的接口,不同的算法有不同的實現,我們在調用的時候只需要注入不同的對象即可以實現算法,這樣的可維護性便大大增強,因而出現了今天要講的策略模式。
2.該模式適應范圍
(一)針對同一類型問題有多種處理方式,具體行為也有差別的時候
(二)需要安全地封裝多種同一類型的操作時
(三)出現同一抽象類有多個子類,有需要通過if..else..或switch..case選擇具體子類時
3.具體應用
???在交通管理局中,一般不同的交通工具有不同的乘車價格,同種交通工具根據路程不同又有不同的乘車價格,因此筆者在這里舉這個現實中的例子作為應用案例來解說。
(一)一般將所有情況封裝到一個類中,通過靜態方法直接引用的時候
public void strategyMode_tradition_Test(int tranFlag,int km ){
//車類型標志
// int tranFlag = 0;//1 巴士 2的士 3地鐵
// int km = 25;//行走路程
if (tranFlag == 1){
if (km < 10){
///..一種價格
}else if (km>10 && km<25){
//..一種價格
}//else if...
}else if(tranFlag == 2){
if (km < 3){
///..一種價格
}else if (km>3 && km<20){
//..一種價格
}//else if...
}else if(tranFlag == 3){
if (km < 15){
///..一種價格
}else if (km>15 && km<40){
//..一種價格
}//else if...
}
}
???這里我們明顯能看到,如果條件越多,會造成這個方法,整個類更加臃腫,如果我們要添加一種新的交通工具的時候,也需要重新回到類源文件中修改。
(二) 利用策略模式實現
1.首先是定義一個抽象價格計算接口
/**
* Created by wsy on 2016/2/19.
*/
public interface CalculateUtil {
public int calculating(int km);
}
2.分別抽象出不同交通工具的算法
package cn.wsy.mymode.strategyMode;
import android.util.Log;
/**
* 巴士
* Created by wsy on 2016/2/19.
*/
public class BusCalculate implements CalculateUtil{
private final String TAG = this.getClass().getName();
@Override
public int calculating(int km) {
Log.i(TAG,"巴士行程 "+km+"公里,價格為**");
//復雜計算..
return 0;
}
}
package cn.wsy.mymode.strategyMode;
import android.util.Log;
/**
* 地鐵
* Created by wsy on 2016/2/19.
*/
public class SubwayCalculate implements CalculateUtil{
private final String TAG = this.getClass().getName();
@Override
public int calculating(int km) {
Log.i(TAG, "地鐵行程 " + km + "公里,價格為**");
//復雜計算..
return 0;
}
}
package cn.wsy.mymode.strategyMode;
import android.util.Log;
/**
* 的士
* Created by wsy on 2016/2/19.
*/
public class TaxiCalculatie implements CalculateUtil {
private final String TAG = this.getClass().getName();
@Override
public int calculating(int km) {
Log.i(TAG, "的士行程 " + km + "公里,價格為**");
//復雜計算..
return 0;
}
}
3.具體抽象價格算法控制類
/**
* 交通工具價格控制類
* Created by wsy on 2016/2/19.
*/
public class TransportControl {
private CalculateUtil calculateUtil;
public TransportControl(CalculateUtil calculateUtil) {
this.calculateUtil = calculateUtil;
}
public int calculating(int km){
return calculateUtil.calculating(km);
}
}
4.測試方法
public void strategyModeTest(){
TransportControl transportSub = new TransportControl(new SubwayCalculate());
transportSub.calculating(25);
TransportControl transportBus = new TransportControl(new BusCalculate());
transportBus.calculating(55);
}
總之,從我們上面的利用策略模式與直接封裝類的測試方法中,我們能觀察到策略模式帶來的有點是更直觀、更清晰將每個算法職責單一起來。在案例應用程序中,我們只需要在定義TransportControl對象的時候,通過注入不同的對象,就可以引用不同的算法。對比與直接使用if...else..硬編碼形式,更加簡潔。
傻小孩b
學習與分享,與你共勉
博客地址:http://blog.csdn.net/yyeeqe_sy
歡迎加入 qq群: 450302004 (移動開發者狂熱群)在這里,可以談理想,可以談技術,更可以談帥哥美女歡迎