策略模式(Strategy)

1. 策略模式的定义

策略模式是一种行为型设计模式,用于定义一系列算法(或行为),将它们封装为独立的类,并使这些算法可以相互替换。模式的核心思想是通过抽象策略接口解耦具体算法与调用者,使得算法的变化独立于使用它的客户端。

2. 模式结构

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

  • 抽象策略(Strategy):定义算法方法的接口(如 IPaymentStrategy)。
  • 具体策略(Concrete Strategy):实现策略接口的具体算法类(如 AlipayStrategy)。
  • 上下文环境(Context):持有一个策略对象的引用,通过策略接口与具体策略交互(如 PaymentContext)。
3. 优点
  • 符合开闭原则:新增策略无需修改现有代码。
  • 消除条件分支:避免复杂的 if-elseswitch 逻辑。
  • 代码复用:多个场景可以复用同一策略。
  • 灵活性:运行时动态切换算法。
4. 适用场景
  • 系统需要多种算法实现同一功能(如支付方式、排序规则)。
  • 需要隐藏算法细节,避免暴露复杂逻辑。
  • 算法需要动态切换或扩展。

5. .NET Core 示例:支付策略

场景说明

假设需要实现一个支付系统,支持 支付宝微信支付银联支付,不同支付方式的处理逻辑不同。通过策略模式封装支付逻辑,客户端可灵活切换支付方式。

代码实现
(1) 定义抽象策略接口
public interface IPaymentStrategy
{
    void ProcessPayment(decimal amount);
}
(2) 实现具体策略类
// 支付宝支付策略
public class AlipayStrategy : IPaymentStrategy
{
    public void ProcessPayment(decimal amount)
    {
        Console.WriteLine($"支付宝支付:{amount} 元,调用扫码接口...");
    }
}

// 微信支付策略
public class WeChatPayStrategy : IPaymentStrategy
{
    public void ProcessPayment(decimal amount)
    {
        Console.WriteLine($"微信支付:{amount} 元,调用人脸识别接口...");
    }
}

// 银联支付策略
public class UnionPayStrategy : IPaymentStrategy
{
    public void ProcessPayment(decimal amount)
    {
        Console.WriteLine($"银联支付:{amount} 元,调用银行卡密码接口...");
    }
}
(3) 上下文环境类
public class PaymentContext
{
    private IPaymentStrategy _strategy;

    // 通过构造函数注入策略
    public PaymentContext(IPaymentStrategy strategy)
    {
        _strategy = strategy;
    }

    // 动态切换策略
    public void SetStrategy(IPaymentStrategy strategy)
    {
        _strategy = strategy;
    }

    // 执行支付
    public void ExecutePayment(decimal amount)
    {
        _strategy.ProcessPayment(amount);
    }
}
(4) 客户端调用
class Program
{
    static void Main(string[] args)
    {
        // 创建策略对象
        var alipay = new AlipayStrategy();
        var wechatPay = new WeChatPayStrategy();
        var unionPay = new UnionPayStrategy();

        // 创建上下文并设置初始策略
        var context = new PaymentContext(alipay);
        context.ExecutePayment(100);  // 使用支付宝支付

        // 动态切换策略
        context.SetStrategy(wechatPay);
        context.ExecutePayment(200);  // 切换为微信支付

        context.SetStrategy(unionPay);
        context.ExecutePayment(300);  // 切换为银联支付
    }
}
输出结果
支付宝支付:100 元,调用扫码接口...
微信支付:200 元,调用人脸识别接口...
银联支付:300 元,调用银行卡密码接口...

6. 扩展:结合依赖注入(DI)

在 .NET Core 中,可通过依赖注入容器管理策略对象,避免手动实例化。

(1) 注册策略服务
public void ConfigureServices(IServiceCollection services)
{
    services.AddTransient<IPaymentStrategy, AlipayStrategy>();
    services.AddTransient<IPaymentStrategy, WeChatPayStrategy>();
    services.AddTransient<IPaymentStrategy, UnionPayStrategy>();
    
    // 注册上下文类
    services.AddTransient<PaymentContext>();
}
(2) 通过工厂模式选择策略
public class PaymentStrategyFactory
{
    private readonly IEnumerable<IPaymentStrategy> _strategies;

    public PaymentStrategyFactory(IEnumerable<IPaymentStrategy> strategies)
    {
        _strategies = strategies;
    }

    public IPaymentStrategy GetStrategy(string paymentType)
    {
        return paymentType switch
        {
            "Alipay" => _strategies.OfType<AlipayStrategy>().First(),
            "WeChatPay" => _strategies.OfType<WeChatPayStrategy>().First(),
            "UnionPay" => _strategies.OfType<UnionPayStrategy>().First(),
            _ => throw new ArgumentException("无效的支付类型")
        };
    }
}

总结

策略模式通过抽象算法实现、动态切换逻辑,显著提升了代码的灵活性和可维护性。在 .NET Core 中,结合依赖注入可以更优雅地管理策略对象,适合电商支付、规则引擎等需要多算法灵活切换的场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Gene Z

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值