本文結合大話設計模式中策略模式總結,以會員結賬使用不同的結算規則來描述策略模式。
package com.neutron.strategy;/** * 折扣策略,策略模式中基礎算法 * S:策略接口,定義所有支持的算法公共接口 * * @author neutron * */public interface Discount { /** * 打折策略 * * @param original 原始價格 * @return 折扣后價格 */ double discount(double original);}算法實現類
package com.neutron.strategy;/** * 策略模式中具體算法,全價策略 * S:具體策略類,封裝具體的算法或行為 * * @author neutron * */public class Percent100 implements Discount { PRivate static final double percent100 = 1; @Override public double discount(double original) { return percent100 * original; }}package com.neutron.strategy;/** * 策略模式中具體算法,9折策略 * S:具體策略類,封裝具體的算法或行為 * * @author neutron * */public class Percent90 implements Discount { private static final double percent90 = 0.9; @Override public double discount(double original) { return percent90 * original; }}package com.neutron.strategy;/** * 策略模式中具體算法,8折策略 * S:具體策略類,封裝具體的算法或行為 * * @author neutron * */public class Percent80 implements Discount { private static final double percent80 = 0.8; @Override public double discount(double original) { return percent80 * original; }}package com.neutron.strategy;/** * 策略模式中具體算法,7折策略 * S:具體策略類,封裝具體的算法或行為 * * @author neutron * */public class Percent70 implements Discount { private static final double percent70 = 0.7; @Override public double discount(double original) { return percent70 * original; }}package com.neutron.strategy;/** * 策略模式中具體算法,全價策略 * S:具體策略類,封裝具體的算法或行為 * * @author neutron * */public class Percent100 implements Discount { private static final double percent100 = 1; @Override public double discount(double original) { return percent100 * original; }}會員等級
package com.neutron.entity;/** * 會員等級 * * @author neutron * */public enum Level { gold, silver, bronze, plain;}策略上下文
package com.neutron.strategy;import com.neutron.entity.Level;/** * S:Content上下文,維護策略對象引用 * * @author neutron * */public class DiscountContent { private Discount count; public DiscountContent(Level level) { switch(level) { case gold: this.count = new Percent70(); break; case silver: this.count = new Percent80(); break; case bronze: this.count = new Percent90(); break; case plain: this.count = new Percent100(); break; default:this.count = new Percent100(); } } public double contentDiscount(double original) { return this.count.discount(original); } }客戶端
package com.neutron.client;import com.neutron.entity.Level;import com.neutron.strategy.DiscountContent;/** * 策略模式客戶端 * * @author neutron * */public class Client { /* * 優點: * 1.最大程度上將客戶端和業務處理分離出來 * 2.客戶端只傳遞會員等級和原始金額 */ public static void main(String[] args) { double goldPrice = new DiscountContent(Level.gold).contentDiscount(100); System.err.println("gold member: " + goldPrice); double silverPrice = new DiscountContent(Level.silver).contentDiscount(100); System.err.println("silver member: " + silverPrice); double price = new DiscountContent(Level.plain).contentDiscount(100); System.err.println("plain member: " + price); }}總結
/** * 策略模式案例 * * 策略模式生活中案例:商場打折,出差去某地可以乘車、輪船、步行、飛機 * 案例解讀:統一行為采用不同的實現方式,打折是計算最終價格的不同方式,去某地出差使用不同的交通工具而已 * 策略模式:定義了算法家族,分別封裝起來,讓它們之間可以相互替換,此模式讓算法的變化獨立于使用該算法的客戶端 * 解讀定義:定義去某地的各種出發方式,步行、汽車、輪船、飛機等,可以使用任意一種方式并最終到達某地, * 客戶端調用的最終結果是到某地,具體如何實現客戶端不關心。 * 其他解說: * 1.策略模式都是完成相同的工作,只是實現不同,可以以相同的方式調用所有算法,減少算法類和使用算法的耦合。 * 2.策略模式封裝算法,只要在業務中需要不同時間或者應用不同的業務規則,都可以使用策略模式處理變化的可能性 * 3.策略模式中,選擇具體實現的職責由客戶端承擔,并且轉移給策略模式的上下文對象 * @author neutron */package com.neutron.strategy;
新聞熱點
疑難解答