策略设计模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式能够让算法变化,不会影响其他的算法。
可以理解成:QQ上的不同的状态模式,每种状态都是独立的,用户可以根据自己的近期心情来选择QQ上的状态模式。简单说,就是 "把做一件事的不同方法分开装,想用哪个就换哪个",让代码更灵活,好维护。
比如做一个电商折扣系统:
- 正常情况是 "无折扣" 策略
- 节假日用 "满 100 减 20" 策略
- VIP 用户用 "打 8 折" 策略
这些折扣算法就是不同的 "策略",当需要切换折扣时,直接换一个策略类就行,不用动结算的主逻辑。
核心好处:
-
想加新策略(比如 "第二件半价"),直接新增一个策略类,不用改老代码
-
策略之间互相独立,改一个不影响其他
-
调用方可以根据情况动态选策略(比如根据用户等级自动切换)
@SuppressWarnings("all")
public class Shopping {
static void main() {
System.out.print("entre AccpetModel:");
Integer AccpetModel = Integer.valueOf(IO.readln());
CashContext cashContext = new CashContext(AccpetModel);
System.out.print("entre the Price:");
Double AccpetPrice = Double.valueOf(IO.readln());
System.out.print("entre the Quantity:");
Integer AccpetQuantity = Integer.valueOf(IO.readln());
double result = cashContext.getResult(AccpetPrice, AccpetQuantity);
System.out.println("result = " + result);
}
}
//收取费用的抽象类
abstract class CashSuper{
public abstract double AccpetCash(double money, int num);
}
//正常收费
class CashNormal extends CashSuper{
@Override
public double AccpetCash(double money, int num) {
return moneynum;
}
}
//打折收费
class CashRebate extends CashSuper{
private double moneyRebate = 1d;
/初始化时需要输入折扣数 0.8/
public CashRebate(double moneyRebate) {
this.moneyRebate = moneyRebate;
}
@Override
public double AccpetCash(double money, int num) {
return moneynum*moneyRebate;
}
}
//返利条件
class CashReturn extends CashSuper{
private double moneyCondition = 1d;//返利条件
private double moneyReturn = 0d;//返利数值
/*返利收费,初始化需要输入返利条件和返利值
* 比如当满300返利100时,就输入300和100
* /
public CashReturn(double moneyCondition, double moneyReturn) {
this.moneyCondition = moneyCondition;
this.moneyReturn = moneyReturn;
}
/计算收费,当到达返利条件,就按原价减去返利/
@Override
public double AccpetCash(double money, int num) {
double result = money * num;
if (result > moneyReturn && moneyCondition > 0)
/每当满了300就会返现100块钱/
result = result - Math.floor( result / moneyCondition) moneyReturn;
return result;
}
}
/**/
class CashContext{
private CashSuper cashSuper;
/通过构造方法传入收费策略/
public CashContext(int cateType){
switch (cateType) {
case 1 -> cashSuper = new CashNormal();
case 2 -> cashSuper = new CashRebate(0.8);
case 3 -> cashSuper = new CashReturn(300, 100);
default -> throw new IllegalStateException("Unexpected value: " + cateType);
}
}
public double getResult(double money, int num){
return this.cashSuper.AccpetCash(money, num);
}
}