策略模式
2017-02-09 05:42
417 查看
策略模式
本文结合大话设计模式中策略模式总结,以会员结账使用不同的结算规则来描述策略模式。策略接口
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 4000 * */ 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;
相关文章推荐
- 设计模式之Strategy(策略)
- 设计模式(20)-策略模式(Strategy)
- 策略模式之C++版本
- 应用泛型的策略模式
- 对象模型--策略、模式、应用 笔记1
- [浪子学编程][MS Enterprise Library]ObjectBuilder之设计模式(一):策略模式
- (22)策略模式-Strategy Pattern-康熙收复台湾-明珠和索额图的不同策略
- 从诸葛亮的三个锦囊妙计谈策略模式
- 《Java与模式》学习笔记之九-----策略模式(Strategy Pattern)
- AspectJ实现设计模式(二)——策略模式
- 设计模式之Strategy(策略)
- 设计模式之Strategy(策略)
- 策略模式之C#版本(原创翻译版本)
- 设计模式实战(一)——使用策略模式(strategy pattern)实现多关键字排序
- Delphi模式编程之策略模式(下)
- 設計模式之Strategy(策略)
- 深入浅出策略模式
- 设计模式——策略模式
- 设计模式之策略模式(Strategy)
- 对象模型--策略、模式、应用 笔记2---选择对象