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中实现策略模式。通过这种方式,你可以很容易地添加新的折扣计算方法,而不需要修改现有的代码,从而遵循了开闭原则(对扩展开放,对修改关闭)。

相关推荐
紧跟先前的步伐几秒前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
Hespethorn3 分钟前
112 个 Valgrind 错误,1 个根因:C++ 多线程服务的关机顺序复盘
后端·架构
秋天的怀念_David4 分钟前
算法一千零一夜 · 第二十六夜 协议的母语
java·spring boot·算法
灿飞4 分钟前
Kotlin与Java虚拟机八:控制流与 when:卫语句、上下文相关解析与穷尽性
java·kotlin
小兔子11 分钟前
new Date('2024-01-01') 和 new Date('2024/01/01') 差在哪
后端
文丑颜不良啊1 小时前
LeetCode2021~2040题目解析
java·leetcode
bksczm1 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库
Oiiouui1 小时前
linux服务器部署Logto后端与对应前端的实现
linux·服务器·前端·后端
liangbo72 小时前
Spring系列03:Bean 的三种注册方式
java·spring
余槐i2 小时前
MySQL 8.0 联合索引走错:为什么加了索引查询反而从 200ms 变成 8s
java·spring boot·mysql·docker·性能优化