本文實例講述了Java設計模式之策略模式原理與用法。分享給大家供大家參考,具體如下:
策略模式定義了一系列的算法,並將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立於使用它的客戶而獨立變化。其中JDK裡面的TreeSet類和TreeMap類就用到了策略模式。這兩個類是帶排序的集合類,其中排序的規則就相當於策略模式裡定義的一系列算法,而集合類就相當於是策略模式裡的環境類,供用戶使用,用只知道TreeSet和TreeMap是帶排序的,至於怎麼排序的,是由排序的算法決定的。
策略模式由三部分組成:抽象策略角色,具體策略角色,環境角色。
抽象策略角色:策略類,通常由一個接口或者抽像類實現。
具體策略角色:實現了抽象策略類,並包裝了相關的算法和行為。
環境角色:持有一個策略類的引用,最終給客戶端調用。
下面提供一個簡單的策略模式的代碼實例:
1.抽象策略角色:定義一個接口Strategy。
package com.test;/** * 策略模式抽象角色* @author zhouwen * */public interface Strategy { public int calculate(int a, int b);}2.具體策略角色:實現Strategy接口。例子中是實現加減乘除的運算。
package com.test;/** * 策略模式具體策略類* 實現加法運算* @author zhouwen * */public class AddStrategy implements Strategy { @Override public int calculate(int a, int b) { return a + b; }} package com.test;/** * 策略模式具體策略類* 實現減法運算* @author zhouwen * */public class SubtractStrategy implements Strategy { @Override public int calculate(int a, int b) { return a - b; }} package com.test;/** * 策略模式具體策略類* 實現乘法運算* @author zhouwen * */public class MultiplyStragety implements Strategy { @Override public int calculate(int a, int b) { return a * b; }} package com.test;/** * 策略模式具體策略類* 實現除法運算* @author zhouwen * */public class DivideStrategy implements Strategy { @Override public int calculate(int a, int b) { return a / b; }}3.環境角色:在環境角色中定義一個抽象角色的引用,並暴露出計算的方法,供客戶端調用。
package com.test;/** * 策略模式環境類* @author zhouwen * */public class Environment { private Strategy strategy; public Environment(Strategy strategy){ this.strategy = strategy; } //用以改變策略public void setStrategy(Strategy strategy){ this.strategy = strategy; } public Strategy getStrategy(){ return strategy; } //暴露計算的接口,供客戶端調用public int calculate(int a, int b){ return strategy.calculate(a, b); }}4.最後編寫客戶端的代碼:
package com.test;public class Client { public static void main(String[] args) { AddStrategy addStrategy = new AddStrategy(); Environment environment = new Environment(addStrategy); System.out.println(environment.calculate(3, 4)); SubtractStrategy subStrategy = new SubtractStrategy(); environment.setStrategy(subStrategy); System.out.println(environment.calculate(3, 4)); MultiplyStragety multiplyStrategy = new MultiplyStragety(); environment.setStrategy(multiplyStrategy); System.out.println(environment.calculate(3, 4)); DivideStrategy divideStrategy = new DivideStrategy(); environment.setStrategy(divideStrategy); System.out.println(environment.calculate(3, 4)); }}總結:
由客戶端的System.out.println(environment.calculate(3, 4));這句代碼,我們並不知道具體調用的是哪個實現類,只有知道了傳給環境角色的具體策略類我們才知道調用哪個類,這樣就能實現客戶端和具體策略算法的分離,使程序易於切換、易於理解、易於擴展。
策略模式的優缺點:
優點:
1.策略模式的用意是針對一組算法,將每一個算法封裝到具有共同接口的獨立的類中,從而使得他們可以相互替換。如提供的例子中通過set方法對策略進行替換。
2.策略模式使得算法可以在不影響客戶端的情況下發生變化。使用策略模式可以把行為和環境分隔開。
3.環境類負責維持和查詢行為類,各類算法則在具體策略中提供。由於算法和環境獨立開來,算法的修改不會影響環境和客戶端。
缺點:
1.客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。
2.會造成很多的策略類。
更多java相關內容感興趣的讀者可查看本站專題:《Java面向對象程序設計入門與進階教程》、《Java數據結構與算法教程》、《Java操作DOM節點技巧總結》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對大家java程序設計有所幫助。