设计模式之-----策略模式
2015-07-20 09:45
351 查看
最近手头工作比较多,好长时间没有看设计模式了,今天把之前的复习了一下,顺便又学习了一个新的模式:“策略模式”。
由于我在这方面还是小白,我在学习策略模式的时候,总感觉和简单工厂模式差不多。。。基本上没差别,在网上搜了搜,大多都是概念性的对象,不太好理解,希望有经验的朋友能帮我解惑一下,可以在下边留言,先谢过了。
还是,先来一段一个概念(取自百度百科)
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
这一句话的概念,说是很好说,但是理解起来还是有些困难。。来个实例,应该可以深入的理解了。
业务逻辑:
商场,有不同的价格计算方法,有正常的收费,打折的收费,满多少反多少的收费模式,可以灵活切换不同的模式。
首先,建立一个公共的接口ICash,之后每个新建的算法都要实现这个接口.
新建正常的收费类
打折的方法
最主要的,Context类,通过这个类,来统一调用接口方法,其大概原理就是通过用不同的实现类来实例化Context,来调用不同的方法
最后的测试方法
最后的结果
我个人认为,策略模式的一个很大的缺点,就是使用者必须要知道全部的算法的实现方法,因为Context要使用该实现方法来进行实例化,这对于使用者是个不小的负担,不过策略模式的优点害死比较明显的,就是调用者只需要知道Context里的方法既可以实现任务,同一个方法的入口,管理起来相对轻松了许多。
由于我在这方面还是小白,我在学习策略模式的时候,总感觉和简单工厂模式差不多。。。基本上没差别,在网上搜了搜,大多都是概念性的对象,不太好理解,希望有经验的朋友能帮我解惑一下,可以在下边留言,先谢过了。
还是,先来一段一个概念(取自百度百科)
策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
这一句话的概念,说是很好说,但是理解起来还是有些困难。。来个实例,应该可以深入的理解了。
业务逻辑:
商场,有不同的价格计算方法,有正常的收费,打折的收费,满多少反多少的收费模式,可以灵活切换不同的模式。
首先,建立一个公共的接口ICash,之后每个新建的算法都要实现这个接口.
package com.strategy.arithmetic.intf; /** * 定义了一个消费的接口 * @author ZHENGWEI * @date Jul 20, 2015 */ public interface ICash { /** * 所有消费算法都要有的一个接口,负责返回最后的钱数 * @return */ public double totalMoney(); }
新建正常的收费类
package com.strategy.arithmetic.impl; import com.strategy.arithmetic.intf.ICash; /** * 正常的收费类,没有打折等活动 * @author ZHENGWEI * @date Jul 20, 2015 */ public class CsahNormal implements ICash { private double m; /** * 构造方法,负责将传入的价格相加 * @param moneyArr */ public CsahNormal(double... moneyArr){ for(double money : moneyArr){ this.m += money; } } /** * 返回最终所用的钱数 */ public double totalMoney() { return this.m; } }
打折的方法
package com.strategy.arithmetic.impl; import com.strategy.arithmetic.intf.ICash; public class CashDiscount implements ICash { private double m; /** * 构造方法,将打折数与商品单价传入,返回最后的价格 * @param dis * @param money */ public CashDiscount(double dis, double money){ this.m = money * dis; } /** * 返回最终所用的钱数 */ public double totalMoney() { return this.m; } }
最主要的,Context类,通过这个类,来统一调用接口方法,其大概原理就是通过用不同的实现类来实例化Context,来调用不同的方法
package com.strategy.context; import com.strategy.arithmetic.intf.ICash; public class Context { /** * 算法的公共接口 */ private ICash iCash; /** * 构造方法,通过传入的不同的算法的实现,执行不同类的方法 * @param iCash */ public Context(ICash iCash){ this.iCash = iCash; } /** * 获取最终结果 * @return */ public double getResult(){ return iCash.totalMoney(); } }
最后的测试方法
package com.strategy.main; import com.strategy.arithmetic.impl.CashDiscount; import com.strategy.arithmetic.impl.CsahNormal; import com.strategy.context.Context; public class Main { public static void main(String[] args) { Context context; // 正常收费 CsahNormal csahNormal = new CsahNormal(2.1, 1.1, 3); context = new Context(csahNormal); System.out.println(context.getResult());//----------------> // 打8折 这两个方法完全一样,但是结果不同 CashDiscount cashDiscount = new CashDiscount(0.8, 20); context = new Context(cashDiscount); System.out.println(context.getResult());//-----------------> } }
最后的结果
我个人认为,策略模式的一个很大的缺点,就是使用者必须要知道全部的算法的实现方法,因为Context要使用该实现方法来进行实例化,这对于使用者是个不小的负担,不过策略模式的优点害死比较明显的,就是调用者只需要知道Context里的方法既可以实现任务,同一个方法的入口,管理起来相对轻松了许多。
相关文章推荐
- SecureCRT 保存FTP用户登录密码
- 解决:C8051系列单片机,代码量较大时工作不正常问题
- Log4j配置文件的详解
- 让应用停留在后台模式的三种方式
- #1032 : 最长回文子串
- [extjs5学习笔记]第三十八节 sencha CMD 6.0.0.220版本安装
- [LeetCode][Java] Reverse Linked List II
- PuTTY SSH 使用证书免密码登录
- PuTTY + Xming 远程使用 Linux GUI
- 跟我一起写 Makefile(四)
- [extjs5学习笔记]第三十八节 sencha CMD 6.0.0.220版本安装
- [extjs5学习笔记]第三十八节 sencha CMD 6.0.0.220版本安装
- PuTTY + Xming 远程使用 Linux GUI
- error: stray ‘\302’ in program; error: stray ‘\240’ in program 问题解决办法
- 工业相机中的全局快门与卷帘快门
- 超越MySQL:三个流行MySQL分支的对比
- 在ubuntu 12.04 上将默认的gcc 4.6 改成gcc 4.4
- Eclipse将引用了第三方jar包的Java项目打包成jar文件的三种方法
- 特征选择方法之信息增益
- 30天自制操作系统day16