文章目录
一、引言
策略模式(Strategy Pattern)是一种行为型设计模式,它定义了算法族,并分别封装起来,让它们之间可以互相替换。这种模式使得算法的变化独立于使用算法的客户端,从而实现多态性的策略选择。
二、应用场景
策略模式适用于以下场景:
- 系统需要在多种算法中进行切换,每种算法解决的是同一类问题,但具体实现和表现不同。
- 需要在运行时根据具体情况动态地选择合适的算法来执行。
例如,在电商系统中,针对不同的会员等级可能有不同的折扣计算方式,如普通会员打折、VIP会员折上折、尊享会员满减等。策略模式可以帮助灵活地切换并应用这些不同的折扣策略。
三、模式定义与实现
策略模式的核心组成部分包括:
- Strategy(策略接口/抽象类):声明了一系列方法,用于定义所有支持的算法的公共接口。
- ConcreteStrategy(具体策略类):实现了Strategy接口,提供了具体的算法实现。
- Context(上下文角色):持有一个Strategy对象引用,用以调用其方法来执行相关算法,并在必要时能够更改所使用的策略。
以电商平台的折扣策略为例,来具体实现策略模式:
-
定义策略接口(Strategy):创建一个名为
DiscountStrategy
的接口,其中包含一个计算折扣的方法。javapublic interface DiscountStrategy { double calculateDiscount(double originPrice, int memberLevel); }
-
定义具体策略类(ConcreteStrategy):为每种会员等级创建相应的折扣策略实现类,如
NormalMemberDiscount
、VIPMemberDiscount
和PremiumMemberDiscount
。javapublic class NormalMemberDiscount implements DiscountStrategy { @Override public double calculateDiscount(double originPrice, int memberLevel) { return originPrice * 0.9; // 普通会员9折 } } public class VIPMemberDiscount implements DiscountStrategy { @Override public double calculateDiscount(double originPrice, int memberLevel) { return originPrice * 0.85; // VIP会员8.5折 } } public class PremiumMemberDiscount implements DiscountStrategy { @Override public double calculateDiscount(double originPrice, int memberLevel) { if (originPrice > 500) { return originPrice - 200; // 尊享会员满500减200 } else { return originPrice * 0.8; // 若不满500元,按8折计算 } } }
-
定义上下文角色(Context):创建一个名为
Order
的类,其中包含一个DiscountStrategy
对象的引用,并提供设置和获取折扣策略的方法,以及计算订单实际价格的方法。javapublic class Order { private DiscountStrategy discountStrategy; public void setDiscountStrategy(DiscountStrategy strategy) { this.discountStrategy = strategy; } public double calculateFinalPrice(double originPrice, int memberLevel) { return discountStrategy.calculateDiscount(originPrice, memberLevel); } }
-
应用端使用:在应用程序中,可以根据会员等级动态选择并应用相应的折扣策略。
javapublic class StrategyPatternDemo { public static void main(String[] args) { Order order = new Order(); int normalMemberLevel = 1; order.setDiscountStrategy(new NormalMemberDiscount()); System.out.println("普通会员应付金额:" + order.calculateFinalPrice(1000, normalMemberLevel)); int vipMemberLevel = 2; order.setDiscountStrategy(new VIPMemberDiscount()); System.out.println("VIP会员应付金额:" + order.calculateFinalPrice(1000, vipMemberLevel)); int premiumMemberLevel = 3; order.setDiscountStrategy(new PremiumMemberDiscount()); System.out.println("尊享会员应付金额:" + order.calculateFinalPrice(1000, premiumMemberLevel)); } }
测试结果
四、优缺点分析
优点:
- 提高了系统的灵活性:策略模式允许在运行时动态地改变和选择算法,增强了程序的可扩展性。
- 易于新增策略:只需添加新的具体策略类即可增加新的行为,对已有代码无影响。
潜在挑战:
- 可能导致类数量增加:每一种策略都需要创建一个新的类,当策略种类较多时,类的数量会迅速增长。
- 客户端必须了解各种策略之间的区别:客户端需要知道如何选择和切换策略,这可能会增加客户端的复杂性。
总结
策略模式通过将一系列可互换的算法封装成单独的类,使得客户端可以在运行时动态地选择或更换算法,从而实现灵活多变的行为策略。在实际应用中,合理运用策略模式有助于简化业务逻辑,降低耦合度,提高代码的可维护性和复用性。同时应注意控制策略类的增长,避免过度设计,确保模式的应用符合实际需求。