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);
    }
    }

相关推荐
IT枫斗者枫哥2 小时前
MyBatis一对多分页:LIMIT 20,为什么凑不齐20个订单?
java·数据库
代码方舟2 小时前
Java数据工程:利用天远全网运营商三要素优化线上实名认证合规体验
java·人工智能
BBmmo2 小时前
我的 Java 学习笔记 · 第 7 篇:泛型与通配符
java
独泪了无痕2 小时前
Hutool之RandomUtil:随机数生成的终极利器
java·后端
花开路口2 小时前
深入理解 Java/Kotlin 协变与逆变
java·kotlin
运行时异常2 小时前
【WMS 仓储系统集成 AI Agent 实战】第 7 讲:Vue3 前端工程化——Token 刷新锁、Markdown 渲染踩坑与权限体系
java
她的男孩2 小时前
开放接口限流从 20 改到 200 还是每分钟 20 次:拆完防重放+幂等+限流,我找到 5 个静默失效的坑
java·后端·架构
天天被压力2 小时前
【Python 量化取数指南 #13】Python 把行情落库:sqlite 一键存,回测随用随取
java·人工智能·python
天天被压力2 小时前
【Python 量化取数指南 #14】Python 清洗行情数据:复权停牌对齐,回测不翻车
java·人工智能·python
独泪了无痕2 小时前
开发利器Hutool之MapUtil的使用
java·后端