策略模式(Strategy)—养牛场卖鲜奶
来源:互联网 发布:迅游加速器for mac 编辑:程序博客网 时间:2024/05/17 03:48
策略模式:策略模式属于对象的行为模式。
其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。
策略模式使得算法可以在不影响到客户端的情况下发生变化。
策略模式的三个角色:
环境(Context)角色:持有一个Strategy的引用。
抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。
具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。
类图如下:
例子如下:
村里的养牛场向村民提供福利,要向外销售鲜奶,
如果是团购享受批发价八折,如果是零售,不享受打折优惠,
现在就是要包装价格的计算方法,分为零售价格与批发价格两种计算方式
/** * 环境角色类 * 养牛场出售瓶装鲜奶 * 零售(SellRetail)不打折 * 批发(WholeSale) 打八折 * @author wang */public class Discount {//持有一个具体策略对象private SalesLevel salesLevel;/** * 构造函数 传入一个具体策略对象 * @param salesLevel */public Discount(SalesLevel salesLevel){this.salesLevel = salesLevel;}/** * 计算鲜奶打折后的价格 * @param price 鲜奶的原价 * @return 打折的价格 */public double calculatePrice(double price){return this.salesLevel.calculatePrice(price);}}/** * 抽象策略类 * @author wang */public interface SalesLevel { /** * 策略方法 * @param price * @return */public double calculatePrice(double price);}/** * 具体策略类 * 零售价格,不打折 * @author wang */public class SellRetail implements SalesLevel {public double calculatePrice(double price) { return price;}}/** * 具体策略类 * 批发价格 八折 * @author wang */public class WholeSale implements SalesLevel{public double calculatePrice(double price){ return price * 0.8;}}public class Client {public static void main(String[] args){//零售//选择并创建要使用的策略类对象SalesLevel salesLevel = new SellRetail();//创建环境Discount price = new Discount(salesLevel);//计算价格double discount = price.calculatePrice(10);System.out.println("零售的折前价格:10元,折后价格:"+discount);//批发//选择并创建要使用的策略类对象SalesLevel wholeSalesLevel = new WholeSale();//创建环境Discount wholePrice = new Discount(wholeSalesLevel);//计算价格double wholeDiscount = wholePrice.calculatePrice(100);System.out.println("批发的折前价格:100元,折后价格:"+wholeDiscount);}}运行结果如下:
但很重要的一点是,策略模式只支持一个维度的变化,如果新增加一种平行维度计算方式,那可以随时插入即可,比如大批量采购超过500瓶了,可以给于比批发更便宜的价格,
但是要加入酸奶这种产品,然后也要采用批发零售这样的折扣方式,此时的策略模式就不会适用了。
0 0
- 策略模式(Strategy)—养牛场卖鲜奶
- 适配器模式(Adapter)—山下的养牛场
- 门面模式(Facade)(外观模式)—向养牛场送货
- 策略(Strategy)模式
- Strategy(策略)模式
- 策略(Strategy)模式
- Strategy(策略模式)
- 策略模式(Strategy)
- 策略模式(Strategy)
- Strategy(策略模式)
- 策略模式(Strategy)
- 策略模式(Strategy)
- 策略(strategy)模式
- 策略模式(strategy)
- 策略(strategy)模式
- 策略模式(Strategy)
- 策略模式(Strategy)
- 策略模式(Strategy)
- Cyapi使用心得
- 企业服务总线--解决方案剖析,第 2 部分: 利用 WebSphere6中的SIBus实现ESB
- iOS 开发 实现 将16进制字符串转换成16进制数
- 企业服务总线--解决方案剖析,第 3 部分: 利用 WBI 5实现 ESB
- DESKTOP.INI
- 策略模式(Strategy)—养牛场卖鲜奶
- 末了2015
- 使用Xcode Instruments Leak解决内存泄漏问题
- SSO单点登录思路以及实现
- 企业服务总线--解决方案剖析,第 4 部分: 企业服务总线的实施策略与总线集成
- 关于arrayAdapter
- 数字输出格式的控制
- Android ViewPager + Fragment 实现滑动标签效果
- Android中View(视图)绘制不同状态背景图片原理深入分析以及StateListDrawable使用详解