策略模式,定義一組算法(代碼),將它們封裝起來,使其能夠相互替換。html
策略模式首先要針對不一樣的狀況(算法、代碼)定義不一樣的策略類。算法
首先看個一段代碼ide
public class Test { public static void main(String[] args) { insertCode(); } public static void insertCode() { System.out.println("start"); //此處插入一段代碼 System.out.println("end"); } }
要想插入代碼有什麼方法呢,咱們能夠定義個Insert接口,在其中定義insertCode方法。測試
而後具體的類去實現它,並將該類做爲參數傳遞給main中的inserCode方法。this
插入接口spa
public interface Insert { void insertCode(); }
插入接口實現類code
public class HelloWroldCode implements Insert { @Override public void insertCode() { // TODO Auto-generated method stub System.out.println("Hello World!"); } }
測試htm
public class Test { public static void main(String[] args) { insertCode(new HelloWroldCode()); } public static void insertCode(Insert insertCode) { System.out.println("start"); insertCode.insertCode();//此處插入一段代碼 System.out.println("end"); } }
須要變換插入代碼,只須要將insertCode方法的參數修改便可,針對不一樣的代碼都封裝成一個類。對象
插入的那段代碼能夠看作是策略,策略能夠是不一樣的代碼,算法等。blog
策略模式須要策略對象,就是上述的Insert的實現類。
下面看下一個加減的例子,加減能夠看作是兩種策略。
咱們把加減抽取出來,造成兩種策略。
策略接口
public interface Strategy { public int doOperation(int num1, int num2); }
加操做
public class OperationAdd implements Strategy{ @Override public int doOperation(int num1, int num2) { // TODO Auto-generated method stub return num1 + num2; } }
減操做
public class OperationSubstract implements Strategy{ @Override public int doOperation(int num1, int num2) { // TODO Auto-generated method stub return num1 - num2; } }
使用策略的Context類,根據策略的不一樣會執行不一樣的操做。
public class Context { private Strategy strategy;//策略對象決定最後操做 public Context(Strategy strategy) { this.strategy = strategy; } public int doOperation(int num1, int num2) { return strategy.doOperation(num1, num2);//調用策略對象的doOperation方法 } }
Main
public class Main { public static void main(String[] args) { //初始化context對象,並指定策略對象爲加操做 Context context = new Context(new OperationAdd()); System.out.println("4 + 3 = " + context.doOperation(4, 3)); //並指定策略對象爲減操做 context = new Context(new OperationSubstract()); System.out.println("4 - 3 = " + context.doOperation(4, 3)); } }
運行結果:
4 + 3 = 7
4 - 3 = 1
參考資料: