策略模式對應於解決某個問題的演算法集合,允許使用者從這些演算法集合中選擇合適的演算法,可以根據具體的業務需求,在不修改原有程式碼的基礎上增加新的演算法策略,這樣不僅實現了演算法或業務獨立,而且可以做到統一切換、統一呼叫。
- 相關概念
- 使用場景
- 實現
相關概念#
- 抽象策略角色:一般使用介面來統一定義策略方法;
- 具體策略角色:封裝具體的策略演算法;
- 環境角色:完成策略演算法的統一對外方法給客戶端呼叫。
使用場景#
- 適合同一類業務但是具體表現行為不同的業務,如進貨價格根據進貨數量的差異提供不同的進貨價格;
- 便於切換不同演算法,避免改動原有程式碼的業務,如 Android 開發中多圖片框架的切換,如果使用策略設計模式來封裝就可以方便切換圖片加載框架,避免再次修改原有程式碼。
實現#
下面以旅客的出遊方式為例實現一下策略設計模式,創建抽象策略角色如下:
/**
* 抽象策略角色
* @author jzman
*/
public interface IStratey {
//出行
void trip();
}
然後,創建具體的策略角色如下:
- 乘飛機:
/**
* 具體的策略角色
* @author jzman
*/
public class AirStrategy implements IStratey{
@Override
public void trip() {
System.out.println("乘坐飛機!");
}
}
- 步行:
/**
* 具體的策略角色
*/
public class PersonStrategy implements IStratey{
@Override
public void trip() {
System.out.println("步行!");
}
}
- 乘火車:
/**
* 具體的策略角色
*/
public class TrainStrategy implements IStratey{
@Override
public void trip() {
System.out.println("乘坐火車!");
}
}
然後,創建環境角色如下:
/**
* 環境角色
* 主要用於與具體的策略進行交互,分離了演算法與客戶端的呼叫,使得演算法獨立於客戶端,方便演算法策略的切換
*/
public class Context {
private IStratey iStratey;
public Context(IStratey iStratey) {
super();
this.iStratey = iStratey;
}
public void setiStratey(IStratey iStratey) {
this.iStratey = iStratey;
}
//具體業務邏輯
public void tripType() {
iStratey.trip();
}
}
最後,客戶端的呼叫如下:
/**
* 客戶端呼叫
*/
public class StrategyClient {
public static void main(String[] args) {
//創建具體的策略角色
IStratey stratey = new AirStrategy();
//創建環境角色,可以隨意切換需要的策略
Context con = new Context(stratey);
//呼叫具體的演算法
con.tripType();
}
}
上述程式碼輸出結果如下:
乘坐飛機!
這是個比較簡單的例子,可能沒有實際意義,今天總結一下策略設計設計模式的使用,一方面是策略設計模式的溫習,另一方面是計劃使用策略設計模式封裝一下 Android 開發中的圖片加載框架,今天的文章就到此為止。