策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注的是对象的创建,而策略模式关注的是算法的多样性。工厂模式是一种创建型模式,而策略模式是一种行为型模式。
在计算机科学中,设计模式是一种被广泛接受并用于解决特定问题的经验丰富的解决方案,这些模式提供了一种可重用的模板,可以帮助开发人员更容易地编写代码,同时提高代码的质量和可维护性,本文将详细介绍策略模式,包括其定义、特点、优势以及如何应用。
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,策略模式让算法独立于使用它的客户端。
策略模式的主要组成部分有:
1、抽象策略(Strategy):定义所有支持的算法的公共接口。
2、具体策略(Concrete Strategy):实现抽象策略中的操作。
3、上下文(Context):持有一个策略的引用,提供给客户端使用。
策略模式的特点如下:
1、策略模式实现了对象的行为的动态绑定,可以在运行时改变对象的行为。
2、策略模式可以避免使用多重条件判断语句,使代码更加简洁易读。
3、策略模式可以提高代码的可扩展性和可维护性,因为可以随时添加新的策略而无需修改原有的代码。
4、策略模式有助于降低系统的耦合度,使得各个组件之间的依赖关系降低。
策略模式的优势主要体现在以下几个方面:
1、提高代码的可重用性:策略模式可以将不同的算法封装在不同的类中,使得这些类可以在不同的上下文中重复使用。
2、降低系统的复杂性:通过将算法的实现与使用它的客户端分离,可以降低系统的复杂性,使得系统更容易理解和维护。
3、提高代码的灵活性:策略模式允许在运行时动态地改变对象的行为,这使得系统更具灵活性,可以根据需要随时调整策略。
4、促进模块化:策略模式有助于将系统分解为更小的、独立的模块,从而促进模块化开发。
下面我们来看一个简单的策略模式的例子:
假设我们有一个电商系统,需要根据用户的购物车中的商品数量来计算折扣,我们可以使用策略模式来实现这个功能,我们需要定义一个抽象策略类,表示计算折扣的算法:
public interface DiscountStrategy { double getDiscount(double originalPrice); }
我们可以创建具体的策略类,实现计算折扣的方法:
public class NoDiscountStrategy implements DiscountStrategy { @Override public double getDiscount(double originalPrice) { return originalPrice; } } public class HalfPriceDiscountStrategy implements DiscountStrategy { @Override public double getDiscount(double originalPrice) { return originalPrice * 0.5; } }
我们需要创建一个上下文类,用于持有一个策略的引用,并提供给客户端使用:
public class ShoppingCartContext { private DiscountStrategy discountStrategy; public void setDiscountStrategy(DiscountStrategy discountStrategy) { this.discountStrategy = discountStrategy; } public double calculateTotalPrice(double originalPrice) { return discountStrategy.getDiscount(originalPrice); } }
我们可以在客户端代码中使用上下文类来获取折扣后的总价:
public class Client { public static void main(String[] args) { ShoppingCartContext shoppingCartContext = new ShoppingCartContext(); shoppingCartContext.setDiscountStrategy(new HalfPriceDiscountStrategy()); // 或者使用 NoDiscountStrategy 其他策略类进行设置 double totalPrice = shoppingCartContext.calculateTotalPrice(100); // 总价为50元(原价100元)或100元(无折扣) System.out.println("Total price: " + totalPrice); } }