在软件开发过程中,我们经常会遇到这样的问题:如何在保持代码简洁的同时,实现功能模块之间的复用?这时,策略模式(Strategy Pattern)就显得尤为重要,策略模式是一种行为设计模式,它定义了一系列算法,并将每个算法封装在一个具有共同接口的类中,使得它们可以相互替换,这样,当我们需要改变算法时,只需更换实现策略的类即可,而无需修改其他使用该算法的代码。
策略模式的主要目的是将一组行为封装到一系列可互换的类中,这些类之间可以相互协作以完成某个任务,策略模式的核心思想是定义一个通用的接口,然后让具体的策略类实现这个接口,这样,我们可以在运行时根据需要选择合适的策略类来执行相应的操作。
下面我们通过一个简单的例子来说明策略模式的用法:
假设我们有一个电商系统,需要对不同类型的订单进行折扣处理,我们可以使用策略模式来实现这个功能,我们定义一个折扣策略接口:
public interface DiscountStrategy { double getDiscountedPrice(double originalPrice); };
我们为每种折扣类型创建一个具体的策略类:
1、首先计算原价和折扣金额:
public class NoDiscountStrategy implements DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { return originalPrice; } }
2、然后计算原价、折扣金额和折后价:
public class HalfPriceDiscountStrategy implements DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { double discount = originalPrice * 0.5; return originalPrice + discount; } }
3、最后计算原价、折扣金额和折后价(满减):
public class FullPriceDiscountStrategy implements DiscountStrategy { @Override public double getDiscountedPrice(double originalPrice) { if (originalPrice >= 100) { // 假设满减条件是订单金额大于等于100元 double discount = originalPrice * 0.8; // 满减8折 return originalPrice + discount; } else { return originalPrice; // 不满足满减条件,返回原价 } } }
现在我们已经实现了三种折扣策略,接下来我们需要在主程序中根据用户的选择来应用相应的策略:
public class Main { public static void main(String[] args) { double originalPrice = 200; // 原价为200元的商品 DiscountStrategy strategy = new NoDiscountStrategy(); // 不使用任何折扣,直接购买原价商品 double discountedPrice = strategy.getDiscountedPrice(originalPrice); // 输出原价200元,未打折 System.out.println("No discount, price: " + discountedPrice); strategy = new HalfPriceDiscountStrategy(); // 采用半价折扣策略 discountedPrice = strategy.getDiscountedPrice(originalPrice); // 输出100元,享受半价优惠后的价格为100元 System.out.println("Half price discount, price: " + discountedPrice); strategy = new FullPriceDiscountStrategy(); // 采用满减折扣策略(满100减20) discountedPrice = strategy.getDiscountedPrice(originalPrice); // 输出160元,满足满减条件后的价格为160元,享受8折优惠后的价格为160元 System.out.println("Full price discount, price: " + discountedPrice); } }
通过以上示例,我们可以看到策略模式可以帮助我们在运行时灵活地选择不同的折扣策略,从而实现代码的复用,这只是一个简单的例子,实际上策略模式可以应用于更复杂的场景,如图形用户界面(GUI)、数据库连接等,策略模式是一种非常实用的设计模式,值得我们在实际项目中加以应用。