策略模式:根据不同情况选择不同行为
发布时间: 2023-12-08 14:13:45 阅读量: 31 订阅数: 35
策略(strategy)模式
# 1. 理解策略模式
## 1.1 什么是策略模式
策略模式是一种行为型设计模式,它允许根据不同的情况选择不同的行为。策略模式将一系列算法封装成独立的具体策略类,并使它们能够互相替换,从而使客户端能够动态地切换策略而不影响代码的其他部分。
策略模式使用了接口和多态的特性,使得具体的策略类可以相互替换,而不需要修改客户端的代码。这种灵活性使得策略模式在处理复杂的业务逻辑或是频繁变化的需求时非常有用。
## 1.2 策略模式的优势
策略模式具有以下优势:
- 策略类之间的互相替换性:通过使用接口,策略模式使得具体的策略类可以互相替换,而不需要修改客户端的代码。
- 策略类的独立性:每个具体的策略类都是单独实现的,它们之间相互独立,可以单独进行测试和维护。
- 策略模式符合开闭原则:当需要新增一种策略时,只需要新增一个具体的策略类,而不需要修改客户端的代码。
## 1.3 策略模式的应用场景
策略模式适用于以下场景:
- 当一个对象具有多种行为,且这些行为可以根据不同的情况选择时,可以使用策略模式来封装这些行为,并使得它们能够相互替换。
- 当需要在运行时根据不同的条件选择不同算法或行为时,可以使用策略模式来实现动态的策略选择。
- 当具体的策略类需要独立测试和维护时,可以使用策略模式将其封装成独立的类。
策略模式在实际开发中有广泛应用,例如在游戏开发中,不同的角色可以使用不同的攻击策略;在电商系统中,根据不同的促销活动选择不同的优惠策略;在交通管理系统中,根据不同的车辆类型确定不同的收费策略等等。
通过了解策略模式的定义、优势和适用场景,我们可以更好地理解策略模式的作用,接下来,我们将通过具体的代码示例来进一步学习策略模式的工作原理和使用方法。
# 2. 策略模式的工作原理
在本章中,我们将深入探讨策略模式的工作原理。我们将会介绍策略接口与具体策略类的概念,并讲解如何切换和调用不同的策略。最后,我们会提供一个具体的示例代码来解析策略模式的实现细节。
#### 2.1 策略接口与具体策略类
在策略模式中,我们首先创建一个策略接口,用于定义各种不同策略的共同操作方法。具体策略类则实现了策略接口,并根据具体的业务需求来实现不同的行为。接下来是一个示例的策略接口:
```java
public interface PaymentStrategy {
void pay(double amount);
}
```
然后,我们创建具体的策略类,例如支付宝支付、微信支付和银行卡支付。这些具体策略类分别实现了策略接口,并根据具体的支付方式完成了相应的支付逻辑。以下是一个示例的具体策略类:
```java
public class AlipayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.printf("使用支付宝支付了%.2f元%n", amount);
}
}
public class WeChatPayStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.printf("使用微信支付了%.2f元%n", amount);
}
}
public class BankCardStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.printf("使用银行卡支付了%.2f元%n", amount);
}
}
```
通过策略接口和具体策略类的定义,我们可以根据不同的支付需求创建不同的支付策略。
#### 2.2 策略的切换与调用
在策略模式中,我们通常使用上下文类来切换和调用策略。上下文类中包含了一个策略接口的引用,可以根据需要在运行时切换不同的策略。以下是一个示例的上下文类:
```java
public class PaymentContext {
private PaymentStrategy paymentStrategy;
public PaymentContext(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void pay(double amount) {
paymentStrategy.pay(amount);
}
}
```
在上述代码中,`PaymentContext` 类的构造函数接受一个 `PaymentStrategy` 对象,并将其保存为策略接口的引用。`setPaymentStrategy` 方法可以在运行时切换不同的策略。`pay` 方法则会调用当前策略对象的 `pay` 方法,实现具体的支付操作。
#### 2.3 示例代码解析
以下是一个示例代码,演示了如何使用策略模式来实现不同的支付方式:
```java
public class StrategyPatternExample {
public static void main(String[] args) {
PaymentContext context = new PaymentContext(new AlipayStrategy());
context.pay(100); // 使用支付宝支付了100.00元
context.setPaymentStrategy(new WeChatPayStrategy());
context.pay(50); // 使用微信支付了50.00元
context.setPaymentStrategy(new BankCardStrategy());
context.pay(200); // 使用银行卡支付了200.00元
}
}
```
在示例代码中,我们首先创建一个 `PaymentContext` 对象,并通过构造函数传入 `AlipayStrategy` 对象,然后调用 `pay` 方法完成支付。接着,我们使用 `setPaymentStrategy` 方法切换为 `WeChatPayStrategy`,再次调用 `pay` 方法完成支付。最后,我们将策略切换为 `BankCardStrategy`,再次调用 `pay` 方法完成支付。
通过上述示例代码,我们可以看到策略模式的灵活性,通过简单的切换策略对象,可以实现不同的行为。策略模式使得代码更加可维护,
0
0