设计模式-策略模式
一、策略模式
——我一直不太信任自己的记忆力,所以我把它们都写下来
23种设计模式基本上都是在大量的实践经验中抽象出来的,虽然我们目前经验还没能达到那种程度,但是一定的时间后翻看设计模式,发现有一部分似曾相识,这不就是我常用的吗?是不是内心一阵窃喜啊。
策略模式跟模板模式确实有一点像,但是区别还是比较明显的,有必要的话看下上一篇博客设计模式-模板模式(http://zyqwst.iteye.com/admin/blogs/2285300/)。
策略模式:策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。
定义看起来比较抽象,直白来说就是把一系列不同的算法封装到具有共同接口的实现类中。调用者根据情境调用不同的实现类。下面类图中,调用者根据需求选择调用StrategyA或StratebyB。
下面看一个Demo:某商品按照顾客Customer,会员VIP,超级会员SVIP有不同的打折力度;分别是不打折、减10%,减20%。根据顾客计算相应的价格。
/** * 价格类 * @author albert * */ public class Price { /**假设商品单价为10元*/ private Double price=10.00d; /** * 按照顾客类型返回实际单价 * @param discount 打折策略 * @return */ public Double actualPrice(Discount discount){ return price*discount.getDiscount(); } } /**打折接口*/ public interface Discount { public Double getDiscount(); } /**会员打折*/ public class VipDiscount implements Discount{ public Double getDiscount(){ return 0.9d; } } /**超级会员打折*/ public class SVipDiscount implements Discount{ public Double getDiscount(){ return 0.8d; } } /**普通顾客不打折*/ public class MemberDiscount implements Discount{ public Double getDiscount(){ return 1d; } }
打折接口Discount;根据三种客户类型有三种打折实现。下面是测试类
public class Test { /** * @param args */ public static void main(String[] args) { Price price = new Price(); Double actualPrice = price.actualPrice(new VipDiscount());//假设是会员,打9折 System.out.println(actualPrice);//结果是9 } }
从例子可以得出结论:算法的选择是平等的,算法的选择完全依赖于调用者当时的情境。策略模式的侧重不是算法的实现,而是对这些算法如何组织和调用。从而让程序更加灵活,具有更好的维护性和扩展性。这也是策略模式相对于模板方法模式的一大区别。