C#中以函数式风格实现策略模式的可行方法有哪些?
C# 函数式风格策略模式实现思路
函数式风格的策略模式核心是把「策略」作为一等函数处理,不用像面向对象那样定义策略接口、编写多个实现类,直接用C#原生的委托承载策略逻辑即可,常见实现思路如下:
1. 委托直接作为参数传入
适合单次策略调用的场景,直接把策略逻辑作为Func/Action参数传入执行入口即可,示例如下:
// 价格计算入口,discountStrategy参数就是传入的折扣策略 public static decimal CalculateFinalPrice(decimal originalPrice, Func<decimal, decimal> discountStrategy) { if (originalPrice <= 0) return 0; return discountStrategy(originalPrice); } // 调用示例:直接传入不同策略的Lambda表达式 // 无折扣 var price1 = CalculateFinalPrice(100, p => p); // 7折 var price2 = CalculateFinalPrice(100, p => p * 0.7m); // 满100减30 var price3 = CalculateFinalPrice(100, p => p >= 100 ? p - 30 : p);
2. 字典预存策略映射
适合需要根据不同条件选择对应策略的场景,把策略的标识和对应的逻辑预先存在字典中,调用时根据标识取出对应策略执行即可:
// 定义策略类型枚举 public enum DiscountType { NoDiscount, SeventyPercentOff, Full100Minus30 } // 预存所有策略的字典 public static readonly Dictionary<DiscountType, Func<decimal, decimal>> DiscountStrategyMap = new() { { DiscountType.NoDiscount, p => p }, { DiscountType.SeventyPercentOff, p => p * 0.7m }, { DiscountType.Full100Minus30, p => p >= 100 ? p - 30 : p } }; // 调用方法 public static decimal CalculatePriceByDiscountType(decimal originalPrice, DiscountType type) { return DiscountStrategyMap.TryGetValue(type, out var strategy) ? strategy(originalPrice) : originalPrice; }
3. 高阶函数实现策略组合
如果需要多个策略叠加执行,可以用高阶函数封装策略的组合逻辑,返回组合后的新策略:
// 高阶函数:接收多个策略,返回组合后的新策略 public static Func<decimal, decimal> CombineDiscountStrategies(params Func<decimal, decimal>[] strategies) { return originalPrice => strategies.Aggregate(originalPrice, (currentPrice, nextStrategy) => nextStrategy(currentPrice)); } // 调用示例:先打7折再走满减 var combinedStrategy = CombineDiscountStrategies( p => p * 0.7m, p => p >= 100 ? p - 30 : p ); var finalPrice = combinedStrategy(200); // 计算结果为110
和面向对象实现的策略模式相比,函数式实现不需要冗余的接口和实现类,新增策略时不需要修改原有入口逻辑,完全符合开闭原则,代码也更简洁灵活。
内容的提问来源于stack exchange,提问作者Anton Gridushko
相关产品推荐
相关产品推荐

