策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
以下通过商场在各种活动模式下的结算方式演示了策略模式与简单工厂模式的结合
1.创建收费基类
/**
* 现金收费基类
*
* @author WangPeng
*
* CashSuper.java 2015年9月28日 下午12:40:18
*/
public abstract class CashSuper {
/**
* 现金结算函数
*
* @param money 应收金额
* @return
*/
public abstract double acceptCash(double money);
}
2.列举可能的收费方式
a.正常收费:
/**
* 正常收费子类
*
* @author WangPeng
*
* CashNormal.java 2015年9月28日 下午12:42:38
*/
public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
b.折扣收费:
/**
* 折扣子类
*
* @author WangPeng
*
* CashRebate.java 2015年9月28日 下午12:50:11
*/
public class CashRebate extends CashSuper {
/**
* 折扣力度
*/
private double moneyRebate = 1;
public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}
@Override
public double acceptCash(double money) {
return money * moneyRebate;
}
}
c.返利收费
/**
* 返利子类 (如:满300减100)
*
* @author WangPeng
*
* CashReturn.java 2015年9月28日 下午12:43:42
*/
public class CashReturn extends CashSuper {
private double moneyCondition = 0.0;
private double moneyReturn = 0.0;
public CashReturn(double moneyCondition, double moneyReturn) {
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
@Override
public double acceptCash(double money) {
if (money >= moneyCondition) {
return money - Math.floor(money / moneyCondition) * moneyReturn;
}
return money;
}
}
3.创建收费策略上下文
/**
* 现金收费工厂
*
* @author WangPeng
*
* CashFactory.java 2015年9月28日 下午1:41:34
*/
public class CashContext {
private CashSuper cs = null;
public CashContext(String type) {
switch (type) {
case "正常收费":
cs = new CashNormal();
break;
case "满300返100":
cs = new CashReturn(300, 100);
break;
case "打8折":
cs = new CashRebate(0.8);
break;
default:
break;
}
}
public double getResult(double money){
return cs.acceptCash(money);
}
}
4.测试
public class Test {
public static void main(String[] args) {
// 测试收费 1000元 正常收费
CashContext cc1 = new CashContext("正常收费");
// 应付款700
System.out.println(cc1.getResult(1000));
// 测试收费 1000元 打8折
CashContext cc2 = new CashContext("打8折");
// 应付款800
System.out.println(cc2.getResult(1000));
// 测试收费 1000元 满300返100
CashContext cc3 = new CashContext("满300返100");
// 应付款700
System.out.println(cc3.getResult(1000));
}
}
输出:
1000.0
800.0
700.0
5.总结
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是同样的工作,只是实现不同,他可以用相同的方式调用所有的算法,减少各种算法类与使用算法类之间的耦合。