設計模式之策略設計模式

原文首發於微信公衆號:jzman-blog,歡迎關注交流!java

策略模式對應於解決某個問題的算法集合,容許用戶從這些算法集合中選擇合適的算法,能夠根據具體的業務需求,在不修改原有代碼的基礎上增長新的算法策略,這樣不只實現了算法或業務獨立,並且能夠作到統一切換、統一調用。算法

相關概念

  • 抽象策略角色:通常使用接口來統必定義策略方法;
  • 具體策略角色:封裝具體的策略算法;
  • 環境角色:完成策略算法的統一對外方法給客戶端調用。

使用場景

  • 適合同一類業務可是具體表現行爲不一樣的業務,如進貨價格根據進貨數量的差別提供不一樣的進貨價格;
  • 便於切換不一樣算法,避免改動原有代碼的業務,如 Android 開發中多圖片框架的切換,若是使用策略設計模式來封裝就能夠方便切換圖片加載框架,避免再次修改原有代碼。

實現

下面以旅客的出遊方式爲例實現一下策略設計模式,建立抽象策略角色以下:設計模式

/** * 抽象策略角色 * @author jzman */
public interface IStratey {
	//出行
	void trip();
}
複製代碼

而後,建立具體的策略角色以下:bash

  • 乘飛機:
/** * 具體的策略角色 * @author jzman */
public class AirStrategy implements IStratey{
	@Override
	public void trip() {
		System.out.println("乘坐飛機!");
	}
}
複製代碼
  • 步行:
/** * 具體的策略角色 * @author jzman */
public class PersonStrategy implements IStratey{

	@Override
	public void trip() {
		System.out.println("乘坐火車!");
	}
}
複製代碼
  • 乘火車:
/** * 具體的策略角色 * @author jzman */
public class TrainStrategy implements IStratey{

	@Override
	public void trip() {
		System.out.println("步行!");
	}
}
複製代碼

而後,建立環境角色以下:微信

/** * 環境角色 * 主要用於與具體的策略進行交互,分離了算法與客戶端的調用,使得算法獨立於客戶端,方便算法策略的切換 * @author jzman */
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();
	}
}
複製代碼

最後,客戶端的調用以下:框架

/** * 客戶端調用 * @author jzman */
public class StrategyClient {
	public static void main(String[] args) {
		//建立具體的策略角色
		IStratey stratey = new AirStrategy();
		//建立環境角色,能夠隨意切換須要的策略
		Context con = new Context(stratey);
		//調用具體的算法
		con.tripType();
	}
}
複製代碼

上述代碼輸出結果以下:ide

乘坐飛機!
複製代碼

這是個比較簡單的例子,可能沒有實際意義,今天總結一下策略設計設計模式的使用,一方面是策略設計模式的溫習,另外一方面是計劃使用策略設計模式封裝一下 Android 開發中的圖片加載框架。能夠選擇關注我的微信公衆號:jzman-blog 獲取最新更新,一塊兒交流學習!學習

相關文章
相關標籤/搜索