策略模式和工厂模式都是设计模式,但它们的关注点不同。工厂模式关注的是对象的创建,而策略模式关注的是算法的封装、分离和替换 。 ,,工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。策略模式是一种行为型模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换 。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它的客户端。
策略模式的主要角色有以下几个:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(ConcreteStrategy):实现抽象策略中的操作,提供具体的算法实现。
3、上下文(Context):持有一个策略类的引用,需要在运行时根据不同的条件选择不同的策略。
下面我们通过一个简单的例子来说明策略模式的使用,假设我们有一个电商平台,需要根据用户的购买金额来计算折扣,我们可以使用策略模式来实现这个功能。
我们定义一个抽象策略类DiscountStrategy
,它包含一个方法calculateDiscount
,用于计算折扣:
public interface DiscountStrategy { int calculateDiscount(int originalPrice, int price); }
我们实现两个具体的策略类NoDiscountStrategy
和HalfPriceDiscountStrategy
,分别表示不打折和打五折的情况:
public class NoDiscountStrategy implements DiscountStrategy { @Override public int calculateDiscount(int originalPrice, int price) { return originalPrice; } } public class HalfPriceDiscountStrategy implements DiscountStrategy { @Override public int calculateDiscount(int originalPrice, int price) { return originalPrice * 0.5; } }
我们定义一个上下文类ShoppingCart
,它包含一个策略类的引用,并提供一个方法setDiscountStrategy
来设置具体的策略:
public class ShoppingCart { private DiscountStrategy discountStrategy; public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public void calculateTotalPrice(int originalPrice, int price) { int discount = discountStrategy.calculateDiscount(originalPrice, price); System.out.println("The total price after discount is: " + (originalPrice + discount)); } }
我们在客户端代码中创建一个ShoppingCart
对象,并根据不同的条件设置不同的折扣策略:
public class Client { public static void main(String[] args) { ShoppingCart shoppingCart = new ShoppingCart(); shoppingCart.calculateTotalPrice(100, 80); // 不打折的情况,输出:The total price after discount is: 180 shoppingCart.setDiscountStrategy(new HalfPriceDiscountStrategy()); // 设置为打五折的情况,输出:The total price after discount is: 140 } }
通过以上示例,我们可以看到策略模式的优点在于它可以让算法的变化独立于使用它的客户端,提高了代码的可扩展性和可维护性。