策略模式和工厂模式都是设计模式,但是它们的关注点不同。工厂模式关注对象创建,而策略模式关注算法多样性 。,,工厂模式是一种创建对象的方式,使得创建对象的过程与使用对象的过程分离。而策略模式则是一种行为型设计模式,可以在运行时动态切换不同的算法或策略。
策略模式是一种行为型设计模式,它将一组行为封装到一系列策略类中,从而使它们可以相互替换,这种模式使得算法的变化独立于使用它的客户端,在面向对象编程中,这意味着你可以在不修改客户端代码的情况下改变算法实现。
策略模式的主要优点如下:
1、灵活性:策略模式允许你在运行时更改算法,而无需修改客户端代码,这使得你的代码更加灵活,更容易适应需求的变化。
2、可扩展性:通过使用策略模式,你可以轻松地添加新的策略,而无需修改现有的客户端代码,这使得你的代码更加可扩展,更容易应对未来的需求。
3、解耦:策略模式将算法与其调用者分离,使得它们可以独立于彼此进行变化,这有助于降低代码之间的耦合度,提高代码的可维护性。
4、易于测试:由于策略模式将算法与其调用者分离,因此你可以针对每个策略单独进行测试,这有助于提高代码的质量和可靠性。
下面是一个简单的策略模式示例:
假设我们有一个电商系统,需要根据用户的地理位置(如国家、城市等)来计算运费,我们可以使用策略模式来实现这个功能,我们需要定义一个表示地理位置的接口:
public interface Location { double calculateShippingCost(); }
我们可以为每个地理位置创建一个实现该接口的策略类:
public class Country implements Location { private String countryName; private double shippingCostPerKg; public Country(String countryName, double shippingCostPerKg) { this.countryName = countryName; this.shippingCostPerKg = shippingCostPerKg; } @Override public double calculateShippingCost() { // 根据国家的运费政策计算运费 } }
同样,我们可以为城市创建一个实现Location
接口的策略类:
public class City implements Location { private String cityName; private double shippingCostPerKg; private double extraChargePerKg; public City(String cityName, double shippingCostPerKg, double extraChargePerKg) { this.cityName = cityName; this.shippingCostPerKg = shippingCostPerKg; this.extraChargePerKg = extraChargePerKg; } @Override public double calculateShippingCost() { // 根据城市的运费政策计算运费 } }
我们可以在客户端代码中使用策略模式来选择合适的运费计算策略:
public class ShippingCalculator { private List<Location> locations; public ShippingCalculator(List<Location> locations) { this.locations = locations; } public double calculateShippingCost(double weight) { for (Location location : locations) { if (location instanceof Country) { return ((Country) location).calculateShippingCost(); } else if (location instanceof City) { return ((City) location).calculateShippingCost(); } else if (location instanceof OtherLocation) { // 其他类型的地理位置也可以根据需要实现相应的策略类来计算运费 } else { throw new IllegalArgumentException("Unsupported location type: " + location); } } throw new IllegalStateException("No suitable location strategy found"); } }
通过使用策略模式,我们可以轻松地为不同的地理位置实现不同的运费计算策略,而无需修改客户端代码,当需要添加新的地理位置类型时,只需创建一个新的策略类并将其添加到客户端即可。