策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注对象的创建,而策略模式关注行为的封装。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
策略模式的主要角色包括:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(Concrete Strategy):实现抽象策略中的操作,即具体的算法实现。
3、上下文(Context):持有一个策略对象的引用,提供给客户端使用。
下面我们通过一个简单的例子来说明策略模式的使用。
假设我们有一个电商系统,需要根据不同的促销策略计算商品的价格,我们可以使用策略模式来实现这个功能。
我们需要定义一个抽象策略,表示不同的促销策略:
Java
public interface PromotionStrategy {
double calculatePrice(double originalPrice);
}
我们需要实现具体的促销策略,我们可以实现一个满减策略和一个折扣策略:
Java
public class FullReductionStrategy implements PromotionStrategy {
@Override
public double calculatePrice(double originalPrice) {
return originalPrice;
}
}
public class DiscountStrategy implements PromotionStrategy {
private double discount;
public DiscountStrategy(double discount) {
this.discount = discount;
}
@Override
public double calculatePrice(double originalPrice) {
return originalPrice * (1 - discount);
}
}
我们需要创建一个上下文类,用于保存当前使用的策略对象:
Java
public class ShoppingCart {
private PromotionStrategy promotionStrategy;
public void setPromotionStrategy(PromotionStrategy promotionStrategy) {
this.promotionStrategy = promotionStrategy;
}
public double getFinalPrice(double originalPrice) {
return promotionStrategy.calculatePrice(originalPrice);
}
}
我们可以在客户端代码中使用策略模式:
Java
public class Client {
public static void main(String[] args) {
ShoppingCart shoppingCart = new ShoppingCart();
shoppingCart.setPromotionStrategy(new FullReductionStrategy()); // 使用满减策略计算价格
System.out.println("满减后的价格为:" + shoppingCart.getFinalPrice(100)); // 输出:满减后的价格为:100.0
;
shoppingCart.setPromotionStrategy(new DiscountStrategy(0.8)); // 使用折扣策略计算价格(8折)
System.out.println("8折后的价格为:" + shoppingCart.getFinalPrice(100)); // 输出:8折后的价格为:80.0
}
}
通过以上示例,我们可以看到策略模式可以帮助我们实现不同算法之间的解耦,使得在不影响客户端的情况下,可以方便地更换算法,策略模式也提高了代码的可扩展性和可维护性。