banner
jzman

jzman

Coding、思考、自觉。
github

策略設計模式

策略模式對應於解決某個問題的演算法集合,允許使用者從這些演算法集合中選擇合適的演算法,可以根據具體的業務需求,在不修改原有程式碼的基礎上增加新的演算法策略,這樣不僅實現了演算法或業務獨立,而且可以做到統一切換、統一呼叫。

  1. 相關概念
  2. 使用場景
  3. 實現

相關概念#

  • 抽象策略角色:一般使用介面來統一定義策略方法;
  • 具體策略角色:封裝具體的策略演算法;
  • 環境角色:完成策略演算法的統一對外方法給客戶端呼叫。

使用場景#

  • 適合同一類業務但是具體表現行為不同的業務,如進貨價格根據進貨數量的差異提供不同的進貨價格;
  • 便於切換不同演算法,避免改動原有程式碼的業務,如 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 開發中的圖片加載框架,今天的文章就到此為止。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。