You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 18:54:04