Spring 设计模式之策略模式

Spring 设计模式之策略模式

策略模式

策略模式:允许定义一系列算法,并将每一个算法封装起来,使它们可以互相替换,且算法的变化可以独立于使用它们的客户端。

构成部分

  • Context(上下文):维护一个对策略对象的引用,该对象用于客户端调用。
  • Strategy(策略接口):定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,以便环境角色可以使用这个接口来调用不同的算法。
  • ConcreteStrategy(具体策略类):实现了策略接口,提供具体的算法实现。

java举例

java 复制代码
// 策略接口  
interface DiscountStrategy {  
    double calculateDiscount(double totalAmount);  
}  
  
// 具体策略1:百分比折扣  
class PercentageDiscountStrategy implements DiscountStrategy {  
    private double percentage;  
  
    public PercentageDiscountStrategy(double percentage) {  
        this.percentage = percentage;  
    }  
  
    @Override  
    public double calculateDiscount(double totalAmount) {  
        return totalAmount * percentage;  
    }  
}  
  
// 具体策略2:固定金额折扣  
class FixedAmountDiscountStrategy implements DiscountStrategy {  
    private double amount;  
  
    public FixedAmountDiscountStrategy(double amount) {  
        this.amount = amount;  
    }  
  
    @Override  
    public double calculateDiscount(double totalAmount) {  
        return amount;  
    }  
}  
  
// 上下文类  
class Order {  
    private DiscountStrategy discountStrategy;  
  
    public Order(DiscountStrategy discountStrategy) {  
        this.discountStrategy = discountStrategy;  
    }  
  
    public double getTotalAmount() {  
        // 假设订单总金额为1000元  
        return 1000.0;  
    }  
  
    public double calculateDiscount() {  
        return discountStrategy.calculateDiscount(getTotalAmount());  
    }  
}  
  
// 客户端使用  
public class ECommercePlatform {  
    public static void main(String[] args) {  
        // 使用百分比折扣策略  
        Order order1 = new Order(new PercentageDiscountStrategy(0.10)); // 10%折扣  
        double discount1 = order1.calculateDiscount();  
        System.out.println("折扣金额: " + discount1);  
  
        // 使用固定金额折扣策略  
        Order order2 = new Order(new FixedAmountDiscountStrategy(50.0)); // 固定减免50元  
        double discount2 = order2.calculateDiscount();  
        System.out.println("折扣金额: " + discount2);  
    }  
}

输出

java 复制代码
折扣金额: 100.0
折扣金额: 50.0

我们定义了一个DiscountStrategy接口,并实现了两个具体策略类:PercentageDiscountStrategy(百分比折扣)和FixedAmountDiscountStrategy(固定金额折扣)。

然后,我们创建了一个Order类作为上下文类,它包含一个对DiscountStrategy对象的引用,并提供了计算折扣的方法。

在客户端代码中,我们根据不同的需求创建了不同的订单对象,并使用了不同的折扣策略来计算折扣金额。

相关推荐
卓怡学长1 小时前
m115乐购游戏商城系统
java·前端·数据库·spring boot·spring·游戏
点云SLAM1 小时前
C++内存泄漏检测之手动记录法(Manual Memory Tracking)
开发语言·c++·策略模式·内存泄漏检测·c++实战·new / delete
国强_dev1 小时前
量体裁衣在技术方案中的应用
设计模式·系统架构
Engineer邓祥浩4 小时前
设计模式学习(16) 23-14 命令模式
学习·设计模式·命令模式
Maddie_Mo5 小时前
智能体设计模式 第二章:路由模式
设计模式
Remember_9935 小时前
【数据结构】深入理解优先级队列与堆:从原理到应用
java·数据结构·算法·spring·leetcode·maven·哈希算法
leikooo6 小时前
Spring AI 工具调用回调与流式前端展示的完整落地方案
java·spring·ai·ai编程
vx1_Biye_Design6 小时前
基于web的物流管理系统的设计与实现-计算机毕业设计源码44333
java·前端·spring boot·spring·eclipse·tomcat·maven
学Linux的语莫6 小时前
python项目打包为镜像
java·python·spring
Java程序员威哥8 小时前
用Java玩转机器学习:协同过滤算法实战(比Python快3倍的工程实现)
java·开发语言·后端·python·算法·spring·机器学习