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

相关推荐
m0_748236832 小时前
Spring Boot日志:从Logger到@Slf4j的探秘
java·spring boot·spring
明明跟你说过2 小时前
【Go语言】从Google实验室走向全球的编程新星
开发语言·后端·go·go1.19
码字哥3 小时前
EasyExcel设置表头上面的那种大标题(前端传递来的大标题)
java·服务器·前端
customer086 小时前
【开源免费】基于SpringBoot+Vue.JS加油站管理系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·maven
Hello.Reader6 小时前
Spring Retry 与 Redis WATCH 结合实现高并发环境下的乐观锁
java·redis·spring
G探险者6 小时前
如何解决垂直越权与水平越权问题
后端
西岭千秋雪_6 小时前
设计模式の单例&工厂&原型模式
java·单例模式·设计模式·简单工厂模式·工厂方法模式·抽象工厂模式·原型模式
陌上笙清净7 小时前
flask内存马的真谛!!!
后端·python·网络安全·flask
fanchael_kui7 小时前
使用elasticsearch-java客户端API生成DSL语句
java·大数据·elasticsearch
m0_748256567 小时前
[CTF夺旗赛] CTFshow Web1-14 详细过程保姆级教程~
java