设计模式之-----策略模式

来源:互联网 发布:管家婆软件打不开 编辑:程序博客网 时间:2024/06/06 05:15

最近手头工作比较多,好长时间没有看设计模式了,今天把之前的复习了一下,顺便又学习了一个新的模式:“策略模式”。

由于我在这方面还是小白,我在学习策略模式的时候,总感觉和简单工厂模式差不多。。。基本上没差别,在网上搜了搜,大多都是概念性的对象,不太好理解,希望有经验的朋友能帮我解惑一下,可以在下边留言,先谢过了。

还是,先来一段一个概念(取自百度百科)

策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

这一句话的概念,说是很好说,但是理解起来还是有些困难。。来个实例,应该可以深入的理解了。


业务逻辑:

商场,有不同的价格计算方法,有正常的收费,打折的收费,满多少反多少的收费模式,可以灵活切换不同的模式。


首先,建立一个公共的接口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里的方法既可以实现任务,同一个方法的入口,管理起来相对轻松了许多。


0 0
原创粉丝点击