Java基础教程(226)行为型模式之策略:策略模式:诸葛亮的锦囊妙计,解锁Java算法自由切换之谜

1 策略模式核心思想

策略模式(Strategy Pattern)的定义十分精妙:定义一系列算法,将每个算法封装起来,并使它们可以相互替换。这种模式让算法独立于使用它的客户而变化,其核心在于将算法的使用与实现分离。

如同诸葛亮给赵云的三个锦囊,每个锦囊都封装了特定情境下的应对策略。赵云不需要理解每个策略的具体实现细节,只需根据实际情况打开相应锦囊执行策略即可。这种思想在软件设计中极具价值,让我们能够灵活应对需求变化。

2 UML结构解析

策略模式包含三个核心角色:

  • Context(环境类):持有一个Strategy对象的引用,根据需要切换不同策略
  • Strategy(抽象策略):定义算法接口,声明策略方法
  • ConcreteStrategy(具体策略):实现Strategy接口,提供具体算法实现

这种清晰的职责分离使得系统易于扩展和维护,新增策略时只需添加新的具体策略类,无需修改现有代码。

3 实战示例:电商折扣系统

想象一个电商平台需要根据不同促销活动计算折扣:普通折扣、满减折扣和会员折扣。使用if-else判断不仅冗长且难以维护,策略模式提供了优雅解决方案。

// 抽象策略接口
public interface DiscountStrategy {
    double applyDiscount(double originalPrice);
}

// 具体策略:普通折扣
public class RegularDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double originalPrice) {
        return originalPrice * 0.9; // 9折
    }
}

// 具体策略:满减折扣
public class FullMinusDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double originalPrice) {
        if (originalPrice >= 200) {
            return originalPrice - 50;
        }
        return originalPrice;
    }
}

// 环境类
public class DiscountContext {
    private DiscountStrategy strategy;
    
    public void setStrategy(DiscountStrategy strategy) {
        this.strategy = strategy;
    }
    
    public double executeStrategy(double price) {
        return strategy.applyDiscount(price);
    }
}

// 客户端使用
public class Client {
    public static void main(String[] args) {
        DiscountContext context = new DiscountContext();
        
        // 使用普通折扣
        context.setStrategy(new RegularDiscount());
        System.out.println("普通折扣后价格: " + context.executeStrategy(300));
        
        // 动态切换为满减折扣
        context.setStrategy(new FullMinusDiscount());
        System.out.println("满减折扣后价格: " + context.executeStrategy(300));
    }
}

4 策略模式的优势与适用场景

优势:

  • 完美符合开闭原则,无需修改上下文即可引入新策略
  • 避免了冗长的条件判断语句
  • 算法可以自由切换和复用

适用场景:

  • 系统需要在多种算法中灵活切换
  • 需要屏蔽算法具体实现细节
  • 存在多重条件判断,且每个条件分支对应一个算法

策略模式与状态模式结构相似但意图不同:策略模式关注算法选择,是主动的;状态模式关注状态转换,是被动的。

5 总结与思考

策略模式通过将算法封装成独立类,实现了算法的动态切换和职责分离。它不仅能消除大量的条件判断,还提高了代码的可测试性和可维护性。在应对频繁变化的业务规则时,策略模式犹如一把利器,让我们的设计更加灵活优雅。

正如《设计模式》中所说:“策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。”掌握策略模式,正是我们迈向高质量软件设计的重要一步。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值