策略模式(2.商场收银软件)
1.策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合。
2策略模式就是用来封装算法的,但在实践中,我们发现可以用它封装几乎任何类的规则,只要在分析过程中听到需要在不同的业务规则,就可以考虑使用策略模式处理,这种变化的可能性
*3.策略模式优点:简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试
/**
*
* 1.@author zhangqf
*现金收取类
*/
public interface CashSuper {
/***
* 收取现金,参数是原价,返回的是当前价(打折,返利后的价格)
* @param money
* @return
*/
public double acceptCash(double money);
}
/**
* 2.正常收费,没有任何活动
* @author zhangqf
*
*/
public class CashNormal implements CashSuper{
@Override
public double acceptCash(double money) {
// TODO Auto-generated method stub
return money;
}
}
/**
* 3.打折收费,
* @author zhangqf
*
*/
public class CashRabate implements CashSuper{
public double moneyRabate;
/**
* 打折收费,传一个参数就可以,打几折
* @param rabate
*/
public CashRabate(String rabate) {
this.moneyRabate=Double.parseDouble(rabate);
}
@Override
public double acceptCash(double money) {
return this.moneyRabate;
}
}
/**
* 4.返利收费,满多少返多少
* @author zhangqf
*
*/
public class CashReturn implements CashSuper{
private double moneyCondition;//满足多少金额,才可以返利
private double moneyReturn;//规定返多少利
/**
* 返利收费两个参数:
* @param moneyCon 满多少金额以上
* @param moneyRe 返利返多少
*/
public CashReturn(String moneyCon,String moneyRe) {
this.moneyCondition=Double.parseDouble(moneyCon);
this.moneyReturn=Double.parseDouble(moneyRe);
}
@Override
public double acceptCash(double money) {
double result=0d;
if (money>this.moneyCondition) {//400>300
result=money-(money/this.moneyCondition)*this.moneyReturn;//400-(400/300)*100;
}
return result;
}
}
/**
* 5.策略类
* @author zhangqf
*1.策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类直接的耦合。
*策略模式就是用来封装算法的,但在实践中,我们发现可以用它封装几乎任何类的规则,只要在分析过程中听到需要在不同的业务规则,就可以考虑使用策略模式处理,这种变化的可能性
*2.策略模式优点:简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试
*/
public class ContextStrategy {
private CashSuper cashSuper;
/**
* 策略模式的Strategy类层次为Context定义了一系列的课供重用的算法或行为,继承有助于析取出这些算法中的公共功能
* 对于打折,返利,或其他的算法,都是对实际商品收费的一种计算方式,通过继承,可以得到他们的公共功能,例如就是获得计算费用的结果getResult
* 这使得算法间有了抽象的父类
* @param type
*/
public ContextStrategy(String type) {
switch (type) {
case "normal":
this.cashSuper=new CashNormal();
break;
case "rebate":
this.cashSuper=new CashRabate("0.5");
break;
case "return":
this.cashSuper=new CashReturn("300", "100");
break;
default:
System.out.println("没有符合模式!");
break;
}
}
/**
* 调用算法
*/
public double getResult(double money) {
return cashSuper.acceptCash(money);
}
}
/**
* 6.我对策略模式的理解:就是封装不同算法,调用公共方法得到结果
* 通过策略模式调用不同的计算算法,得到公共结果(公共结果里包含封装的算法)
* @param args
*/
public static void main(String[] args) {
ContextStrategy contextStrategy=new ContextStrategy("return");
double returnMoney=contextStrategy.getResult(400);
System.out.println("返利收费:"+returnMoney);
}
}
运行结果:返利收费:266.6666666666667
明天用SWT写一个前台小程序,收银这个模块