Java中的设计模式------策略设计模式

策略设计模式:它定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式能够让算法变化,不会影响其他的算法。

可以理解成:QQ上的不同的状态模式,每种状态都是独立的,用户可以根据自己的近期心情来选择QQ上的状态模式。简单说,就是 "把做一件事的不同方法分开装,想用哪个就换哪个",让代码更灵活,好维护。

比如做一个电商折扣系统:

  • 正常情况是 "无折扣" 策略
  • 节假日用 "满 100 减 20" 策略
  • VIP 用户用 "打 8 折" 策略

这些折扣算法就是不同的 "策略",当需要切换折扣时,直接换一个策略类就行,不用动结算的主逻辑。

核心好处:

  1. 想加新策略(比如 "第二件半价"),直接新增一个策略类,不用改老代码

  2. 策略之间互相独立,改一个不影响其他

  3. 调用方可以根据情况动态选策略(比如根据用户等级自动切换)

    @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 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;
    }
    /计算收费,当到达返利条件,就按原价减去返利/
    @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);
    }
    }

相关推荐
uesowys2 小时前
华为OD算法开发指导-简易内存池
java·算法·华为od
Lucifer__hell2 小时前
【python+tkinter】图形界面简易计算器的实现
开发语言·python·tkinter
2301_812914872 小时前
py day34 装饰器
开发语言·python
期待のcode2 小时前
Dockerfile镜像构建
java·docker·容器
小满、2 小时前
对象住哪里?——深入剖析 JVM 内存结构与对象分配机制
java·jvm·#java对象分配·#hotspot实现
卡提西亚2 小时前
C++笔记-24-文件读写操作
开发语言·c++·笔记
How_doyou_do2 小时前
模态框的两种管理思路
java·服务器·前端
m0_748248022 小时前
C++ 异常处理全解析:从语法到设计哲学
java·c++·word
仟濹2 小时前
IDEA 软件下载 + 安装 | 操作步骤
java·ide·intellij-idea