首页 > 其他 > 详细

设计模式-策略模式

时间:2016-03-31 02:21:11      阅读:248      评论:0      收藏:0      [点我收藏+]

一、策略模式

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??——我一直不太信任自己的记忆力,所以我把它们都写下来?

?23种设计模式基本上都是在大量的实践经验中抽象出来的,虽然我们目前经验还没能达到那种程度,但是一定的时间后翻看设计模式,发现有一部分似曾相识,这不就是我常用的吗?是不是内心一阵窃喜啊。

?

策略模式跟模板模式确实有一点像,但是区别还是比较明显的,有必要的话看下上一篇博客设计模式-模板模式(http://zyqwst.iteye.com/admin/blogs/2285300/)。

? ??

策略模式:策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。

定义看起来比较抽象,直白来说就是把一系列不同的算法封装到具有共同接口的实现类中。调用者根据情境调用不同的实现类。下面类图中,调用者根据需求选择调用StrategyA或StratebyB。


bubuko.com,布布扣
?

下面看一个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 VipDiscount 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
	}

}

?

从例子可以得出结论:算法的选择是平等的,算法的选择完全依赖于调用者当时的情境。策略模式的侧重不是算法的实现,而是对这些算法如何组织和调用。从而让程序更加灵活,具有更好的维护性和扩展性。这也是策略模式相对于模板方法模式的一大区别。

设计模式-策略模式

原文:http://zyqwst.iteye.com/blog/2287589

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!