策略模式
时间: 2023-06-29 19:11:29 浏览: 60
策略模式是一种行为型设计模式,它定义了一系列算法,将每个算法封装起来并且使它们之间可以相互替换。策略模式让算法独立于使用它们的客户端而变化。
策略模式的实现通常包括以下几个角色:
1. 环境类:它持有一个策略接口的引用,并在需要时调用策略接口的方法。
2. 抽象策略类:它定义了一个公共接口,用于所有具体策略类实现。
3. 具体策略类:它实现了抽象策略类定义的接口,提供具体的算法实现。
策略模式的优点是,它提供了一种灵活的方式来切换算法,而不需要更改客户端代码。另外,由于每个具体的策略都被封装在一个独立的类中,因此可以方便地进行单元测试和维护。
下面是一个使用策略模式的简单示例:
假设我们正在开发一个商场收银系统,该系统需要根据不同的优惠策略来计算商品的价格。我们可以使用策略模式来实现这个功能。
首先,我们定义一个抽象的优惠策略接口:
```
public interface DiscountStrategy {
double calculateDiscount(double price);
}
```
然后,我们定义不同的具体优惠策略类:
```
public class NoDiscountStrategy implements DiscountStrategy {
@Override
public double calculateDiscount(double price) {
return price;
}
}
public class TenPercentDiscountStrategy implements DiscountStrategy {
@Override
public double calculateDiscount(double price) {
return price * 0.9;
}
}
public class TwentyPercentDiscountStrategy implements DiscountStrategy {
@Override
public double calculateDiscount(double price) {
return price * 0.8;
}
}
```
最后,我们定义一个环境类,它持有一个优惠策略接口的引用,并在需要时调用策略接口的方法:
```
public class Cashier {
private DiscountStrategy discountStrategy;
public void setDiscountStrategy(DiscountStrategy discountStrategy) {
this.discountStrategy = discountStrategy;
}
public double calculatePrice(double price) {
return discountStrategy.calculateDiscount(price);
}
}
```
现在,我们可以根据不同的优惠策略来创建不同的具体策略类,并将它们注入到 Cashier 对象中,实现不同的优惠计算。
```
Cashier cashier = new Cashier();
cashier.setDiscountStrategy(new NoDiscountStrategy());
double price1 = cashier.calculatePrice(100); // 100.0
cashier.setDiscountStrategy(new TenPercentDiscountStrategy());
double price2 = cashier.calculatePrice(100); // 90.0
cashier.setDiscountStrategy(new TwentyPercentDiscountStrategy());
double price3 = cashier.calculatePrice(100); // 80.0
```
通过使用策略模式,我们可以避免使用大量的 if-else 或 switch-case 语句来实现不同的算法,从而使我们的代码更加简洁、清晰、易于维护和扩展。