设计模式-策略模式
一、策略模式
——我一直不太信任自己的记忆力,所以我把它们都写下来
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
}
}
从例子可以得出结论:算法的选择是平等的,算法的选择完全依赖于调用者当时的情境。策略模式的侧重不是算法的实现,而是对这些算法如何组织和调用。从而让程序更加灵活,具有更好的维护性和扩展性。这也是策略模式相对于模板方法模式的一大区别。
上一篇: 策略模式
下一篇: python代码由cpu转成gpu运行