2023-08-20 03:05:42
JavaScript中的策略模式是一种行为设计模式,通过定义一系列可相互替换的算法(策略),将算法封装为独立对象,使它们能独立于使用它们的客户端变化。 其核心在于动态选择和切换算法实现,避免修改客户端代码,适用于需要频繁扩展或修改的功能场景。
核心特性电商会员折扣计算根据会员等级(普通、VIP、超级VIP)动态计算订单总价,策略可独立扩展。
const strategies = { normal: (price) => price, vip: (price) => price * 0.8, superVip: (price) => price * 0.7};class ShoppingCart { calculateTotal(memberType, items) { const total = items.reduce((sum, item) => sum + item.price, 0); return strategies[memberType](total); }}游戏角色攻击行为不同角色(战士、法师)拥有独立攻击策略,通过策略模式动态切换行为。
支付方式选择支持多种支付渠道(信用卡、支付宝、微信),策略可独立维护。
策略数量过多
问题:每个策略需单独定义,可能导致类/函数膨胀。
优化:使用工厂模式集中管理策略创建。const strategyFactory = { create: (type) => strategies[type] || strategies.normal};
客户端需了解策略
问题:调用方需明确策略名称,可能增加维护成本。
优化:通过上下文对象封装策略选择逻辑。class Context { constructor(strategy) { this.strategy = strategy; } setStrategy(strategy) { this.strategy = strategy; } executeStrategy(price) { return this.strategy(price); }}
动态加载策略
场景:大型应用中按需加载策略,减少初始资源消耗。
实现:结合模块化(如ES6 Modules)动态导入。
功能需频繁扩展(如新增会员等级、支付方式)。
算法逻辑复杂且可能独立变化(如订单处理规则)。
策略逻辑简单且固定时,直接使用条件语句更简洁。
策略间存在强依赖时,需重新评估设计。
总结:策略模式通过解耦算法与使用方,提升了代码的灵活性和可维护性。合理应用需权衡策略复杂度与系统需求,结合工厂模式、动态加载等技术可进一步优化实现。