您的位置:首页 > 其它

设计模式--策略模式

2016-05-18 13:07 260 查看
1.策略模式

定义:它定义了算法家族,分别封装起来,让他们之间可以相互替换

以商场收银系统为例,现在需求是商场办促销活动,所有商品打8折、满300减200等等

有了第一讲的基础,很容易想到简单工厂模式。








代码实现































我们根据下拉列表选择促销方式,在工厂里实例化出对应的促销类即可,即使在出现满500减300的促销方式再也不用大改代码了

现在问题来了,商场的促销方式有很多,改变的也越快,我们需要频繁的建立促销类、改动工厂类,重新编译装载在各个收银机中,怎么解决呢???

没错,就是咱们今天讲解的策略模式,下图是基于商场收银系统的策略模式类图 



策略模式与简单工厂模式的区别

如果计算器添加一个开根号的操作

简单工厂模式:新建一个开根号的类,然后在工厂里添加一条switch语句

策略模式:新建一个开根号的类,然后通过Add方式添加进去,不再修改核心代码(修改客户端不算是真正的修改程序)



代码实现












有人可能有疑问了简单工厂模式和策略模式+简单工厂模式结合有什么区别吗?





主要区别

简单工厂模式需要让客户端认识CashSuper和CashFactory,而策略模式与简单工厂模式结合的用法客户端只需要认识CashContext对象,调用CashContext的方法GetResult,这使得具体的收费算法彻底与客户端分离,连算法的父类CashSuper都不让客户端认识了

 

扩展

策略模式与简单工厂模式结合的用法我们也需要频繁的变更CashContext里的switch语句,高手为了减少此类操作,会采用反射操作,做到不再改动CashContext中的代码,使用反射技术直接找到你的算法类;

改进的CashContext

 Class CashContext
{
CashSuper cs = null;
//type包括Nomal、Return、Rebate
Public CashContext(String type){
String className = “Cash”+type
Class<?> c = Class.forName(className);
cs = c.newInstance();
}

Public double GetResult(double money){
return cs.acceptCash(money)
}
}

客户端

......
CashContext cashSuper = new CashContext(cbx.SelectItem.toString());
........
cashSuper.GetResult(....)


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式