本文結(jié)合大話設(shè)計(jì)模式中策略模式總結(jié),以會(huì)員結(jié)賬使用不同的結(jié)算規(guī)則來(lái)描述策略模式。
package com.neutron.strategy;/** * 折扣策略,策略模式中基礎(chǔ)算法 * S:策略接口,定義所有支持的算法公共接口 * * @author neutron * */public interface Discount { /** * 打折策略 * * @param original 原始價(jià)格 * @return 折扣后價(jià)格 */ double discount(double original);} 算法實(shí)現(xiàn)類(lèi)
package com.neutron.strategy;/** * 策略模式中具體算法,全價(jià)策略 * S:具體策略類(lèi),封裝具體的算法或行為 * * @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:具體策略類(lèi),封裝具體的算法或行為 * * @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:具體策略類(lèi),封裝具體的算法或行為 * * @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:具體策略類(lèi),封裝具體的算法或行為 * * @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;/** * 策略模式中具體算法,全價(jià)策略 * S:具體策略類(lèi),封裝具體的算法或行為 * * @author neutron * */public class Percent100 implements Discount { private static final double percent100 = 1; @Override public double discount(double original) { return percent100 * original; }} 會(huì)員等級(jí)
package com.neutron.entity;/** * 會(huì)員等級(jí) * * @author neutron * */public enum Level { gold, silver, bronze, plain;} 策略上下文
package com.neutron.strategy;import com.neutron.entity.Level;/** * S:Content上下文,維護(hù)策略對(duì)象引用 * * @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 { /* * 優(yōu)點(diǎn): * 1.最大程度上將客戶端和業(yè)務(wù)處理分離出來(lái) * 2.客戶端只傳遞會(huì)員等級(jí)和原始金額 */ 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); }} 總結(jié)
/** * 策略模式案例 * * 策略模式生活中案例:商場(chǎng)打折,出差去某地可以乘車(chē)、輪船、步行、飛機(jī) * 案例解讀:統(tǒng)一行為采用不同的實(shí)現(xiàn)方式,打折是計(jì)算最終價(jià)格的不同方式,去某地出差使用不同的交通工具而已 * 策略模式:定義了算法家族,分別封裝起來(lái),讓它們之間可以相互替換,此模式讓算法的變化獨(dú)立于使用該算法的客戶端 * 解讀定義:定義去某地的各種出發(fā)方式,步行、汽車(chē)、輪船、飛機(jī)等,可以使用任意一種方式并最終到達(dá)某地, * 客戶端調(diào)用的最終結(jié)果是到某地,具體如何實(shí)現(xiàn)客戶端不關(guān)心。 * 其他解說(shuō): * 1.策略模式都是完成相同的工作,只是實(shí)現(xiàn)不同,可以以相同的方式調(diào)用所有算法,減少算法類(lèi)和使用算法的耦合。 * 2.策略模式封裝算法,只要在業(yè)務(wù)中需要不同時(shí)間或者應(yīng)用不同的業(yè)務(wù)規(guī)則,都可以使用策略模式處理變化的可能性 * 3.策略模式中,選擇具體實(shí)現(xiàn)的職責(zé)由客戶端承擔(dān),并且轉(zhuǎn)移給策略模式的上下文對(duì)象 * @author neutron */package com.neutron.strategy;
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注