策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注的是对象创建,而策略模式关注的是算法多样性。 ,,工厂模式是一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。它有三种类型:简单工厂、工厂方法和抽象工厂。,,策略模式是一种行为型设计模式,可以在运行时动态切换不同的算法或策略。它可以将算法封装、分离和替换,实现开闭原则。
在计算机科学中,设计模式是一种被广泛接受并用于解决特定问题的优秀解决方案,它们提供了一种可重用的、经过验证的代码结构,可以帮助开发者更容易地创建和维护复杂的软件系统,我们将深入探讨策略模式这一设计模式。
策略模式定义如下:它定义了一系列算法,并将每个算法封装在一个具有共同接口的独立类中,使得它们可以相互替换,策略模式让算法的变化独立于使用它们的客户端。
我们需要理解策略模式的基本构成,它包括以下几个部分:
1、上下文(Context):定义了环境,即策略模式的使用环境,在这个环境中,策略类可以访问到一些上下文信息。
2、策略(Strategy):定义了一系列的算法,这些算法封装在一个具有公共接口的独立类中。
3、具体的策略(Concrete Strategy):实现了策略接口,具体的策略类继承自上下文类,并实现了策略接口中的方法。
4、客户端(Client):调用上下文类的业务方法,获取具体的策略对象,然后调用其方法。
下面,我们通过一个简单的例子来说明策略模式的使用,假设我们有一个电商系统,需要根据用户的购物车中的商品种类和数量来计算总价,我们可以使用策略模式来实现这个功能。
我们需要定义一个策略接口,该接口包含一个计算总价的方法:
public interface Strategy { double calculatePrice(List<CartItem> cartItems); }
我们需要定义两个具体的策略类,分别处理不同的商品种类和数量的情况:
public class NormalStrategy implements Strategy { @Override public double calculatePrice(List<CartItem> cartItems) { double total = 0; for (CartItem item : cartItems) { total += item.getPrice() * item.getQuantity(); } return total; } }
public class DiscountStrategy implements Strategy { @Override public double calculatePrice(List<CartItem> cartItems) { double total = 0; for (CartItem item : cartItems) { total += item.getPrice() * item.getQuantity(); } // 这里可以添加折扣的逻辑,例如满100减10等 return total; } }
我们需要定义一个上下文类,该类包含一个策略对象,并提供一个获取策略对象的方法:
public class ShoppingCartContext { private Strategy strategy; public ShoppingCartContext(Strategy strategy) { this.strategy = strategy; } public Strategy getStrategy() { return strategy; } }
我们需要定义一个客户端类,该类使用上下文类来获取具体的策略对象,并调用其计算总价的方法:
public class ShoppingCartClient { public static void main(String[] args) { // 根据实际情况创建购物车对象和商品列表对象 List<CartItem> cartItems = new ArrayList<>(); ShoppingCartContext context = new ShoppingCartContext(new NormalStrategy()); // 或者使用 new DiscountStrategy();表示使用折扣策略 double totalPrice = context.getStrategy().calculatePrice(cartItems); // 根据上下文获取具体的策略对象,并调用其方法计算总价 System.out.println("Total price: " + totalPrice); // 输出总价 } }