策略模式定義了算法族,分別封裝起來,讓它們之間能夠互相替換,此模式讓算法的變化獨立於使用算法的客戶。(其實相似於if-else模式)java
將一個類中常常改變或者未來可能改變的部分提取出來,做爲一個接口而後在類中包含這個對象的實例,這樣類的實例在運行時就能夠隨意調用實現了這個接口的類的行爲。原理是用多態實現的。算法
系統有不少類,它們的區別僅在於行爲不一樣,一個系統須要動態地在幾種算法中選擇一種。框架
策略模式中包含三部分:
策略(Strategy):策略是一個接口,該接口定義若干個算法標識,即定義了若干個抽象方法。
具體策略(ConcreteStrategy):具體策略是實現策略接口的類,具體策略實現策略接口所定義的抽象方法,即給出算法標識的具體算法。
上下文(Context):上下文是依賴於策略接口的類,即上下文包含有策略聲明的變量。上下文中提供一個方法,該方法委託策略變量調用具體策略所實現的策略接口中的方法。ide
優勢:符合開閉原則,增長程序的可擴展性和可維護性;避免多個if-else判斷
缺點:客戶端必須知道全部策略類,並自行決定使用哪個策略類this
Strategy接口定義了一個算法族,均實現了behavior()方法。
Context是使用到該算法族的類,它的dosomething()方法會調用behavior(),setStrategy(Strategy)方法能夠動態地改變strategy對象,即動態改變Context使用的算法。
設計
通常狀況下,策略模式會結合工廠模式或單例模式一塊兒使用code
java.util.Comparator#compare()
javax.servlet.http.HttpServlet
javax.servlet.Filter#doFilter()
Spring框架中的Resourse以及初始化接口InstantiationStrategy對象
//定義一個策略接口 public interface tmpStrategy{ void quack(); }
//定義具體策略方法 //普通鴨子呱呱叫算法 public class IsQuack implements tmpStrategy{ @Override public void quack(){ System.out.println("普通鴨子呱呱叫"); } } //橡皮鴨子吱吱叫算法 public class Squeak implements tmpStrategy{ @Override public void quack(){ System.out.println("橡皮鴨子吱吱叫"); } } //木頭鴨子不會叫算法 public class MuteQuack implements tmpStrategy{ @Override public void quack(){ System.out.println("木頭鴨子不會叫"); } }
//客戶端調用算法 public class Context { //注入策略接口之後,才能夠選擇策略。 private tmpStrategy strategy; public Context(tmpStrategy strategy){ this.strategy = strategy; } public void setQuackBehavior(){ strategy.quack(); } public static void main(String[] args) { System.out.println("guagua"); Context context1 = new Context(new IsQuack()); context1.setQuackBehavior(); System.out.println("zhizhi"); Context context2 = new Context(new Squeak()); context2.setQuackBehavior(); System.out.println("nono"); Context context3 = new Context(new MuteQuack()); context3.setQuackBehavior(); } }