您的位置:首页 > 其它

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

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

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

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

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

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

业务逻辑:

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

首先,建立一个公共的接口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里的方法既可以实现任务,同一个方法的入口,管理起来相对轻松了许多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: