策略模式,对当前发生的问题可以有对应的解决方案
例如超市活动:
package com.example.demo.pattern.strategy;
//先定义一个现金收费策略的抽象类,当然如果使用接口也可以
public abstract class CashSuper {
public abstract double acceptCash(double money);
}
package com.example.demo.pattern.strategy;
//这是满**返**的具体策略类,承父类,重写抽象方法。
//在实例化对象的时候,需要传入两个参数,
//moneyCondition:满多少钱
//moneyReturn:返多少钱
public class CashReturn extends CashSuper {
private double moneyCondition=0;
private double moneyReturn=0;
public CashReturn(String moneyCondition,String moneyReturn){
this.moneyCondition=Double.valueOf(moneyCondition);
this.moneyReturn=Double.valueOf(moneyReturn);
}
@Override
public double acceptCash(double money) {
return money-Math.floor(money/moneyCondition)*moneyReturn;
}
}
package com.example.demo.pattern.strategy;
//这是打折的具体策略类,在该类的实例对象进行初始化的时候,
//需要传入指定的打折的折扣参数moneyRebate,继承父类,重写抽象方法
public class CashRebate extends CashSuper {
//定义默认折扣
private double moneyRebate=1;
//修改折扣调用此方法
public CashRebate(String moneyRebate){
this.moneyRebate=Double.valueOf(moneyRebate);
}
@Override
public double acceptCash(double money) {
return money*moneyRebate;
}
}
package com.example.demo.pattern.strategy;
//这是正常收费的具体策略类,继承抽象类,完成方法的重写。
public class CashNormal extends CashSuper {
@Override
public double acceptCash(double money) {
return money;
}
}
package com.example.demo.pattern.strategy;
//简单工厂+策略结合,将实例化具体策略的过程由客户端转移到Context类中,是应用的简单工厂。
public class CashContext {
CashSuper cs=null;
public CashContext(String type){
switch (type){
case "1":cs=new CashNormal();break;
case "2":cs=new CashRebate("0.8");break;
case "3":cs=new CashReturn("300","100");break;
}
}
public double GetResult(double money){
return cs.acceptCash(money);
}
}
public class Program {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("请输入收费类型:");
String type=sc.next();
System.out.print("请输入商品总价:");
String money=sc.next();
CashContext cscon=new CashContext(type);
System.out.println("需要收费:"+cscon.GetResult(Double.valueOf(money)));
}
}