定义一个商场收费计算器来简单梳理策略模式
假设商场平时商品正常收费,赶上节假日,会有八折或者满300减100等优惠活动
现在定义实现一个商场收费器,来满足这些促销活动商品计算
策略模式实现
定义抽象类
用于派生出相应的优惠活动算法
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.valueOf(moneyRebate);
}
@Override
public double acceptCash(double money) {
return money*moneyRebate;
}
}
返利类
//返利收费子类
public class CashReturn extends CashSuper{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(String moneyCondition, String moneyReturn){
this.moneyCondition = Double.valueOf(moneyCondition);
this.moneyReturn = Double.valueOf(moneyReturn);
}
@Override
public double acceptCash(double money) {
double result = money;
if(money >= moneyCondition){
result = money - Math.floor(money / moneyCondition) * moneyReturn;
}
return result;
}
}
定义策略实现类
用于根据不同的促销方式,生成对应的算法策略
public class CashContext {
private CashSuper cs;
public CashContext(String type){
switch (type){
case "正常收费":
CashNormal cashNormal = new CashNormal();
this.cs = cashNormal;
break;
case "满300减100":
CashReturn cashReturn = new CashReturn("300", "100");
this.cs = cashReturn;
break;
case "打八折":
CashRebate cashRebate = new CashRebate("0.8");
this.cs = cashRebate;
break;
}
}
public double getResult(double money){
return cs.acceptCash(money);
}
}
定义业务方法验证
import java.util.Scanner;
//策略模式
public class CashCalculator {
public static void func1(){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入单价:");
String strA = scanner.nextLine();
System.out.println("请输入数量:");
String strB = scanner.nextLine();
System.out.println("请输入算法('正常收费','打八折','满300减100'):");
String strOper = scanner.nextLine();
String strResult = "";
CashContext cashContext = new CashContext(strOper);
strResult = cashContext.getResult(Double.valueOf(strA)*Double.valueOf(strB))+"";
System.out.println("收费结果:"+strResult);
}
public static void main(String[] args) {
//策略模式+简单工厂模式
func1();
}
}
执行结果
请输入单价:
500
请输入数量:
10
请输入算法('正常收费','打八折','满300减100'):
满300减100
收费结果:3400.0
分析
策略模式,是一种定义了一系列算法的方法,
可以以相同的方式调用所有的算法,减少各种算法类与实现类之间的耦合度。
但不可避免的还是在算法中加入了switch方法,比如增加一种促销算法的话,还是不可避免的需要修改switch分支。
那是否有增加算法时可以使代码改动量更小的方法呢?
当然有,期待后续的反射技术,“反射反射,程序员的快乐嘛”
联系作者
微信公众号
xiaomingxiaola
(BossLiu)
QQ群
58726094
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 384276224@qq.com