1. 策略模式的定义
策略模式是一种行为型设计模式,用于定义一系列算法(或行为),将它们封装为独立的类,并使这些算法可以相互替换。模式的核心思想是通过抽象策略接口解耦具体算法与调用者,使得算法的变化独立于使用它的客户端。
2. 模式结构
策略模式包含三个核心角色:
- 抽象策略(Strategy):定义算法方法的接口(如
IPaymentStrategy)。 - 具体策略(Concrete Strategy):实现策略接口的具体算法类(如
AlipayStrategy)。 - 上下文环境(Context):持有一个策略对象的引用,通过策略接口与具体策略交互(如
PaymentContext)。
3. 优点
- 符合开闭原则:新增策略无需修改现有代码。
- 消除条件分支:避免复杂的
if-else或switch逻辑。 - 代码复用:多个场景可以复用同一策略。
- 灵活性:运行时动态切换算法。
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 中,结合依赖注入可以更优雅地管理策略对象,适合电商支付、规则引擎等需要多算法灵活切换的场景。
739

被折叠的 条评论
为什么被折叠?



