设计模式--策略模式
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)
}
}
客户端
定义:它定义了算法家族,分别封装起来,让他们之间可以相互替换
以商场收银系统为例,现在需求是商场办促销活动,所有商品打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(....)
相关文章推荐
- PropertyChangeListener简单理解
- 什么是设计模式
- 设计模式之创建型模式 - 特别的变量问题
- 七、设计模式——装饰模式
- 设计模式总结
- 设计模式之创建型模式
- 浅谈设计模式的学习
- Ruby设计模式编程之适配器模式实战攻略
- 实例讲解Ruby使用设计模式中的装饰器模式的方法
- 设计模式中的模板方法模式在Ruby中的应用实例两则
- Ruby设计模式编程中对外观模式的应用实例分析
- 实例解析Ruby设计模式编程中Strategy策略模式的使用
- Ruby中使用设计模式中的简单工厂模式和工厂方法模式
- Ruby使用设计模式中的代理模式与装饰模式的代码实例
- 详解组合模式的结构及其在Ruby设计模式编程中的运用
- C#编程中使用设计模式中的原型模式的实例讲解
- 使用设计模式中的工厂方法模式进行C#编程的示例讲解
- 实例解析C#设计模式编程中简单工厂模式的使用
- 详解C#设计模式编程中生成器模式的使用
- 深入解析C#设计模式编程中对建造者模式的运用