JAVA设计模式,策略模式

策略模式(Strategy Pattern)是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式通常用来实现一组相关的行为或策略,让客户端可以在运行时选择其中的一个来执行。

下面是一个简单的Java代码示例,演示了如何使用策略模式来实现不同的折扣计算方法:

定义策略接口

首先,我们需要定义一个策略接口,该接口声明了一个所有具体策略类必须实现的方法。在这个例子中,我们将定义一个`DiscountStrategy`接口,用于表示折扣计算的策略。

```java

public interface DiscountStrategy {

double applyDiscount(double originalPrice);

}

```

实现具体的策略

接下来,我们为每种折扣策略创建具体的实现类。例如,我们可以有一个固定折扣和一个百分比折扣的实现。

```java

// 固定金额折扣策略

public class FixedDiscountStrategy implements DiscountStrategy {

private final double discountAmount;

public FixedDiscountStrategy(double discountAmount) {

this.discountAmount = discountAmount;

}

@Override

public double applyDiscount(double originalPrice) {

return Math.max(originalPrice - discountAmount, 0); // 确保价格不低于0

}

}

// 百分比折扣策略

public class PercentageDiscountStrategy implements DiscountStrategy {

private final double percentage;

public PercentageDiscountStrategy(double percentage) {

this.percentage = percentage;

}

@Override

public double applyDiscount(double originalPrice) {

return originalPrice * (1 - percentage / 100);

}

}

```

创建上下文类

然后,我们需要创建一个上下文类,这个类持有一个对策略对象的引用,并提供一个方法来设置当前使用的策略。此外,它还提供了一个方法来应用选定的策略。

```java

public class ShoppingCart {

private DiscountStrategy discountStrategy;

public void setDiscountStrategy(DiscountStrategy discountStrategy) {

this.discountStrategy = discountStrategy;

}

public double calculateTotal(double originalPrice) {

if (discountStrategy == null) {

return originalPrice; // 如果没有设置策略,则不打折

}

return discountStrategy.applyDiscount(originalPrice);

}

}

```

使用策略模式

最后,我们可以通过以下方式来使用这些策略:

```java

public class Main {

public static void main(String[] args) {

ShoppingCart cart = new ShoppingCart();

// 假设商品原价是100元

double originalPrice = 100.0;

// 应用固定折扣策略

cart.setDiscountStrategy(new FixedDiscountStrategy(20.0)); // 减去20元

System.out.println("Fixed discount price: " + cart.calculateTotal(originalPrice));

// 应用百分比折扣策略

cart.setDiscountStrategy(new PercentageDiscountStrategy(10)); // 打9折

System.out.println("Percentage discount price: " + cart.calculateTotal(originalPrice));

}

}

```

以上代码展示了如何在Java中实现策略模式。通过这种方式,你可以很容易地添加新的折扣计算方法,而不需要修改现有的代码,从而遵循了开闭原则(对扩展开放,对修改关闭)。

相关推荐
身如柳絮随风扬4 分钟前
Lambda、方法引用与Stream流完全指南
java·开发语言
程序员飞哥6 分钟前
到底Java 适不适合做 AI 呢?
后端·程序员·全栈
yaoyouzhong10 分钟前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring
姗姗的鱼尾喵40 分钟前
Spring/SpringBoot 面试高频(含IOC/AOP/事务)
java·spring boot·面试
Mr_Xuhhh1 小时前
从理论到实践:深入理解算法的时间与空间复杂度
java·开发语言·算法
望眼欲穿的程序猿1 小时前
Vscode Clangd 无法索引 C++17 或者以上标准
java·c++·vscode
带刺的坐椅1 小时前
Spring-AI 与 Solon-AI 深度对比分析报告
java·spring·ai·llm·solon·spring-ai·solon-ai
码事漫谈1 小时前
AI提效,到底能强到什么程度?
前端·后端
IT_陈寒1 小时前
React hooks依赖数组这个坑差点把我埋了
前端·人工智能·后端
爱码少年2 小时前
JAVA获取客户端真实IP地址经典写法与Lambda写法对比
java