其思想是針對一組算法,將每一種算法都封裝到具備共同接口的獨立的類中,從而使它們能夠相互替換。策略模式最大的特色是使得算法能夠在不影響客戶端的狀況下發生變化,從而改變不一樣的功能。算法
策略模式體現了面向對象程序設計中很是重要的兩個原則:編程
舉例:
以 Java 中的 TreeSet 爲例,TreeSet 僅僅知道它只是接收一個 Comparator 這種接口類型,可是具體是哪一種實現類,TreeSet 並不關心,實現類在真正的傳入 TreeSet 以前,TreeSet 自己是不知道的,因此能夠本身去實現 Comparator 接口,而後在實現類裏面去封裝本身的規則(這裏的規則能夠看成是算法),好比說要實現對一個集合元素的排序,究竟是升序仍是降序由本身控制,能夠把這種變化的內容封裝到本身的實現類中,真正運行的時候才知道具體的實現。
測試
public TreeSet(Comparator<? super E> comparator) { this(new TreeMap<>(comparator)); }
也就是說 TreeSet 在底層使用 TreeMap 來實現的,而在 TreeMap 中持有 Camparator 的引用,private final Comparator<? super K> comparator;
。this
/** * 定義抽象策略角色 * 相似於Comparator 接口 */ public interface Strategy{ /** * 定義了兩個數用於計算 */ public int calc(int num1, int num2); }
/** * 定義加法策略 */ 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; } }
/** * 環境角色 * 相似於 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); } }
/** * 測試類 */ 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); } }