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

相关推荐
叫致寒吧19 小时前
Tomcat详解
java·tomcat
同学小张21 小时前
【端侧AI 与 C++】1. llama.cpp源码编译与本地运行
开发语言·c++·aigc·llama·agi·ai-native
踢球的打工仔1 天前
PHP面向对象(7)
android·开发语言·php
S***26751 天前
基于SpringBoot和Leaflet的行政区划地图掩膜效果实战
java·spring boot·后端
汤姆yu1 天前
基于python的外卖配送及数据分析系统
开发语言·python·外卖分析
Yue丶越1 天前
【C语言】字符函数和字符串函数
c语言·开发语言·算法
马剑威(威哥爱编程)1 天前
鸿蒙6开发视频播放器的屏幕方向适配问题
java·音视频·harmonyos
JIngJaneIL1 天前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·社区互助
翔云 OCR API1 天前
人脸识别API开发者对接代码示例
开发语言·人工智能·python·计算机视觉·ocr
V***u4531 天前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言