【Java知识】Java进阶-策略模式实现

策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每一个算法封装起来,使它们可以互换。策略模式使得算法可以独立于使用它的客户端而变化。

主要角色

  1. 策略接口(Strategy):

    • 这是一个抽象类或接口,定义了所有支持的算法的公共接口。
    • 上下文使用这个接口来调用算法。
  2. 具体策略(Concrete Strategy):

    • 实现了策略接口的具体算法。
    • 具体策略类提供了具体的算法实现,并且可以被上下文使用。
  3. 上下文(Context):

    • 持有一个策略接口的引用。
    • 客户端通过上下文来调用算法。上下文在运行时可以动态地改变策略对象,从而改变算法。

示例代码

以下是一个简单的策略模式示例,用于计算不同折扣策略下的价格。

java 复制代码
// 策略接口
interface DiscountStrategy {
    double calculateDiscount(double price);
}

// 具体策略:无折扣
class NoDiscountStrategy implements DiscountStrategy {
    @Override
    public double calculateDiscount(double price) {
        return price;
    }
}

// 具体策略:百分比折扣
class PercentageDiscountStrategy implements DiscountStrategy {
    private double percentage;

    public PercentageDiscountStrategy(double percentage) {
        this.percentage = percentage;
    }

    @Override
    public double calculateDiscount(double price) {
        return price * (1 - percentage / 100);
    }
}

// 具体策略:固定金额折扣
class FixedAmountDiscountStrategy implements DiscountStrategy {
    private double amount;

    public FixedAmountDiscountStrategy(double amount) {
        this.amount = amount;
    }

    @Override
    public double calculateDiscount(double price) {
        return price - amount;
    }
}

// 上下文
class ShoppingCart {
    private DiscountStrategy discountStrategy;

    public ShoppingCart(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public void setDiscountStrategy(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double calculateTotal(double price) {
        return discountStrategy.calculateDiscount(price);
    }
}

// 客户端代码
public class StrategyPatternDemo {
    public static void main(String[] args) {
        double price = 100.0;

        ShoppingCart cart = new ShoppingCart(new NoDiscountStrategy());
        System.out.println("Total price with no discount: " + cart.calculateTotal(price));

        cart.setDiscountStrategy(new PercentageDiscountStrategy(10));
        System.out.println("Total price with 10% discount: " + cart.calculateTotal(price));

        cart.setDiscountStrategy(new FixedAmountDiscountStrategy(15));
        System.out.println("Total price with $15 discount: " + cart.calculateTotal(price));
    }
}

优点

  1. 算法自由切换:策略模式使得算法可以独立于使用它的客户端而变化。
  2. 扩展性好:通过增加新的策略类,可以很容易地扩展系统。
  3. 避免多重条件判断:使用策略模式可以避免在客户端代码中使用多重条件判断来选择算法。

缺点

  1. 策略类数量增加:当策略数量较多时,会增加类的数量,从而增加系统的复杂性。
  2. 客户端需要了解策略:客户端需要知道有哪些策略可供选择,并了解如何创建和配置这些策略对象。

适用场景

  • 当有多种算法需要实现,并且这些算法可以互换时。
  • 当算法在运行时需要动态地改变时。
  • 当算法的实现需要隐藏,或者算法的实现细节对客户端不可见时。

策略模式是一种非常灵活的设计模式,适用于需要动态选择算法的场景。通过封装算法,策略模式使得算法的变化不会影响到使用它的客户端代码。

相关文献

【知识科普】一篇文章教你学会设计模式

相关推荐
weixin_460443562 小时前
2026年新修订《网络安全法》实施:Java私有化考试系统如何做好SBOM、漏洞治理与安全升级?
java·开发语言·在线考试系统·企业培训考试系统·宏远培训考试系统·国企培训考试系统·国产化培训系统
海鸥-w5 小时前
什么是AOP
java
Cc.Y6 小时前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck6 小时前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_926787056 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev6 小时前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by209996 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说6 小时前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha6 小时前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞6 小时前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计