策略模式和简单工厂模式从代码结构上长得很像,但是经过了我百度了大量的资料已经对两种模式的代码进行对比,
最后总结出:
1、策略模式和简单工厂模式都是总分的结构,即通过总的调度接口去判断具体实现哪一种功能——相同点;
2、简单工厂模式的每种实视想法是从功能实现角度出发,每一个实现类都是为了完成某一项功能,
策略模式的每种实现本质是从算法角度出发,每一个实现类是为了实现某一项逻辑功能——不同点
以下是以商场打折为背景,使用策略模式实现不同的打折方式的代码:
打折算法的父类:
public abstract class CashSuper {
public abstract double acceptCash(double money);
}
按原价收费算法:
public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
折扣算法:
public class CashRebate extends CashSuper {
private double moneyRebate = 1d;
public CashRebate(String moneyRebate) {
this.moneyRebate = Double.parseDouble(moneyRebate);
}
@Override
public double acceptCash(double money) {
return money * moneyRebate;
}
}
满额返现算法:
public class CashRerurn extends CashSuper {
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashRerurn(String moneyCondition, String moneyReturn) {
this.moneyCondition = Double.parseDouble(moneyCondition);
this.moneyReturn = Double.parseDouble(moneyReturn);
}
@Override
public double acceptCash(double money) {
double result = money;
if (money >= moneyCondition) {
result = money - Math.round(money / moneyCondition * moneyReturn);
}
return result;
}
}
算法工厂类:
public class CashContext {
CashSuper cs = null;
public CashContext(String type) {
switch (type) {
case "正常收费":
CashNormal cs0 = new CashNormal();
cs = cs0;
break;
case "满300饭100":
CashRerurn cr1 = new CashRerurn("300", "100");
cs = cr1;
break;
case "打8折":
CashRebate cr2 = new CashRebate("0.8");
cs = cr2;
break;
}
}
public double getResult(double money) {
return cs.acceptCash(money);
}
}
客户调用程序:
public class Sale {
static double total = 0.0d;
private static void btnOK_Click() {
CashContext csuper = new CashContext("满300饭100");
double totalPrices = 0d;
totalPrices = csuper.getResult(400);
total = total + totalPrices;
System.out.println("总价:" + total);
}
public static void main(String[] args) {
btnOK_Click();
}
}
以上代码通过和上一篇简单工厂设计模式的例子相对比,可以发现简单工厂的例子中,具体实现的加减乘除四种运算方式只是四种简单的功能,
在简单工厂模式中,具体的实现类也是只考虑功能的实现
而策略模式中,结合着简单工厂模式的总分结构,对应每个具体实现都变成了带有逻辑的算法,通过客户端调用的时候,也是执行具体的逻辑功能,
而不是像加减乘除这样简单的功能实现
这样实现的好处在于商场无论是打5折还是打9折,在程序中的体现就是改变客户端调用打折算法时传递的参数,不再需要对于5折,9折写两个不同的功能实现类,
将最本质的功能整体抽象出来,使代码修改起来更加灵活