Java中的设计模式------策略设计模式
策略设计模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式能够让算法变化,不会影响其他的算法。
可以理解成: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{@Overridepublic double AccpetCash(double money, int num) {return money*num;}
}
//打折收费
class CashRebate extends CashSuper{private double moneyRebate = 1d;/*初始化时需要输入折扣数 0.8*/public CashRebate(double moneyRebate) {this.moneyRebate = moneyRebate;}@Overridepublic double AccpetCash(double money, int num) {return money*num*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;}/*计算收费,当到达返利条件,就按原价减去返利*/@Overridepublic 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);}
}