設計模式-策略模式

概念

其思想是針對一組算法,將每一種算法都封裝到具備共同接口的獨立的類中,從而使它們能夠相互替換。策略模式最大的特色是使得算法能夠在不影響客戶端的狀況下發生變化,從而改變不一樣的功能。算法


特色

策略模式體現了面向對象程序設計中很是重要的兩個原則:編程

  1. 封裝變化的概念
  2. 編程中使用接口,而不是使用具體的實現類(面向接口編程)

舉例:
以 Java 中的 TreeSet 爲例,TreeSet 僅僅知道它只是接收一個 Comparator 這種接口類型,可是具體是哪一種實現類,TreeSet 並不關心,實現類在真正的傳入 TreeSet 以前,TreeSet 自己是不知道的,因此能夠本身去實現 Comparator 接口,而後在實現類裏面去封裝本身的規則(這裏的規則能夠看成是算法),好比說要實現對一個集合元素的排序,究竟是升序仍是降序由本身控制,能夠把這種變化的內容封裝到本身的實現類中,真正運行的時候才知道具體的實現。
測試


組成

  1. 抽象策略角色
    這個是一個抽象的角色,一般狀況下使用接口或者抽象類來定義。對比來講,就是 TreeSet 中的 Comparator。
  2. 具體策略角色
    包裝了具體的算法和行爲。對比來講,就是實現了 Comparator 接口的一組實現類。
  3. 環境角色
    內部會持有一個抽象角色的引用,給客戶端調用。對比說,就是 TreeSet 類。說明:TreeSet 內部必定會有一個策略類的成員變量,這樣作的目的在於當去建立 TreeSet 對象的時候,能夠接收向 TreeSet 類中傳遞的具體的策略類。
    注意:在 TreeSet 的源碼中其實並無 Comarator 的引用,可是在 TreeSet 的構造方法中是用 TreeMap 來構造 TreeSet 的,
public TreeSet(Comparator<? super E> comparator) {
        this(new TreeMap<>(comparator));
    }

也就是說 TreeSet 在底層使用 TreeMap 來實現的,而在 TreeMap 中持有 Camparator 的引用,private final Comparator<? super K> comparator;this


編寫步驟

  1. 定義抽象的策略角色(爲策略對象定義一個公共的接口)
  2. 編寫具體的策略角色(實際上就是實現上面定義的公共接口)
  3. 定義環境角色,內部持有一個抽象策略角色的引用

案例

  1. 定義抽象策略角色
/**
 *	定義抽象策略角色
 *	相似於Comparator 接口
*/
public interface Strategy{
	/**
	 *	定義了兩個數用於計算
	*/
	public int calc(int num1, int num2);
}
  1. 定義具體策略角色(定義加、減兩種策略)
/**
 *	定義加法策略
*/
public class AddStrategy implements Strategy{
	/**
	 *	實現calc 方法,完成兩個數相加
	*/
	public int calc(int num1, int num2){
		return num1 + num2;
	}
}
/**
 *	減法策略
*/
public class SubtractStrategy implements Strategy{
	/**
	 *	實現calc方法,完成兩個數相減
	*/
	public int calc(int num1, int num2){
		return num1 - num2;
	}
}
  1. 環境角色
/**
 *	環境角色
 *	相似於 TreeSet(其實是TreeMap)
*/
public class Environment{
	// 持有對策略類的引用
	private Strategy strategy;
	// 經過構造方法給抽象策略類的引用賦值
	public Environment(Strategy strategy){
		this.strategy = strategy;
	}
	public int calulate(int a, int b){
		retrun strategy.calc(a,b);
	}
}
  1. 測試類
/**
 *	測試類
*/
public class Test{
	public static void main(String[] args){
		// 傳入具體的策略類構造策略對象以抽象策略角色接收(多態)
		Environment environment = new Environment(new AddStrategy());
		int result environment.calulate(1,2);
		System.out.println(result);
	}
}
相關文章
相關標籤/搜索