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

相关推荐
YSL0701241 小时前
C++基础
开发语言·c++
若亦_1 小时前
Java中关于this的三种用法
java·开发语言·intellij-idea
山甫aa1 小时前
锁一篇搞定:乐观锁、悲观锁、CAS、数据库锁与分布式锁【从零开始的 Web 后端学习】
java·数据库·分布式·后端·学习·web
软件技术NINI1 小时前
基于SpringBoot和Vue的博物馆预约平台管理系统的设计与实现
java·毕业设计·毕设
2601_968793142 小时前
Python Requests 轻量自动化:无需浏览器,实现真人级账号浏览模拟
开发语言·python·自动化
eggwyw2 小时前
关于C++为什么不加入垃圾回收机制解析
开发语言·c++
独泪了无痕11 小时前
探索Pinyin4j-Java中的拼音转换利器
java·后端
道尔柯南12 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
来让爷抱一个13 小时前
Python 异步里混用同步库,事件循环被卡住的全过程
开发语言·python
kingx313 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm