• 常用
  • 百度
  • google
  • 站内搜索

资讯

C实现策略模式的途径与最常用的C设计模式实战演练

  • 更新日期:2025-11-30
  • 查看次数:2646

策略模式通过封装不同算法并实现动态替换,避免冗长的条件判断,提升代码可维护性;以订单折扣为例,定义IDiscountStrategy接口,实现NoDiscountStrategy、MemberDiscountStrategy、VIPDiscountStrategy等具体策略,由OrderProcessor上下文调用,结合字典或依赖注入根据用户类型灵活切换策略,适用于多种可互换算法场景。

C#如何实现策略模式?最常用的C#设计模式实战演练

策略模式是一种行为设计模式,它让你定义一系列算法或行为,并将它们封装在独立的类中,使它们可以互相替换。在C#中,策略模式非常实用,尤其是在需要根据不同条件切换处理逻辑时,比如计算折扣、排序方式、验证规则等。

为什么使用策略模式?

当你有一组相似功能但实现方式不同的操作时,避免使用大量的 if-else 或 switch 判断。策略模式通过多态来动态切换行为,让代码更清晰、可维护性更高。

策略模式的核心结构

策略模式包含三个核心部分:

  • 上下文(Context):持有策略接口的引用,负责调用具体策略。
  • 策略接口(Strategy Interface):定义所有支持算法的公共操作。
  • 具体策略(Concrete Strategies):实现策略接口的不同算法。

实战案例:订单折扣计算

假设我们有一个电商系统,需要根据用户类型计算不同折扣:

  • 普通用户:无折扣
  • 会员用户:9折
  • VIP用户:8折

我们可以用策略模式来优雅地实现这个需求。

// 1. 定义策略接口
public interface IDiscountStrategy
{
decimal ApplyDiscount(decimal amount);
}

// 2. 实现具体策略 public class NoDiscountStrategy : IDiscountStrategy { public decimal ApplyDiscount(decimal amount) => amount; }

public class MemberDiscountStrategy : IDiscountStrategy { public decimal ApplyDiscount(decimal amount) => amount * 0.9m; }

public class VIPDiscountStrategy : IDiscountStrategy { public decimal ApplyDiscount(decimal amount) => amount * 0.8m; }

// 3. 上下文类 public class OrderProcessor { private IDiscountStrategy _discountStrategy;

public void SetDiscountStrategy(IDiscountStrategy strategy)
{
    _discountStrategy = strategy;
}

public decimal CalculateTotal(decimal originalAmount)
{
    return _discountStrategy?.ApplyDiscount(originalAmount) ?? originalAmount;
}

}

如何使用?

在实际调用中,你可以根据用户类型动态设置策略:

var processor = new OrderProcessor();

// 普通用户 processor.SetDiscountStrategy(new NoDiscountStrategy()); Console.WriteLine($"普通用户总价: {processor.CalculateTotal(100)}"); // 100

// 会员用户 processor.SetDiscountStrategy(new MemberDiscountStrategy()); Console.WriteLine($"会员用户总价: {processor.CalculateTotal(100)}"); // 90

// VIP用户 processor.SetDiscountStrategy(new VIPDiscountStrategy()); Console.WriteLine($"VIP用户总价: {processor.CalculateTotal(100)}"); // 80

进阶技巧:结合依赖注入

在ASP.NET Core等项目中,你可以把策略注册为服务,并通过工厂模式或字典管理策略实例,提升灵活性。

// 使用字典存储策略(适合策略数量少且固定的场景)
var strategies = new Dictionary<string, IDiscountStrategy>
{
{ "normal", new NoDiscountStrategy() },
{ "member", new MemberDiscountStrategy() },
{ "vip", new VIPDiscountStrategy() }
};

// 根据用户角色选择策略 string userRole = "member"; if (strategies.TryGetValue(userRole, out var strategy)) { processor.SetDiscountStrategy(strategy); }

这种方式便于扩展,也方便单元测试。

总结

策略模式在C#中能有效解耦条件判断和业务逻辑。它适用于:

  • 多种算法需要互换
  • 避免冗长的条件语句
  • 提高代码可测试性和可扩展性

掌握策略模式后,你会发现在处理支付方式、消息通知、数据导出等功能时,代码结构更加清晰。基本上就这些,不复杂但容易忽略。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

imtoken下载 im钱包 imtoken imtoken 快连官网 imtoken imtoken imtoken imtoken imtoken wallet imtoken imtoken官网 imtoken钱包 imtoken下载 imtoken官网 imtoken钱包 imtoken安卓下载 imtoken下载 imtoken官方下载 imtoken官网 imtoken安卓下载 imtoken下载 imtoken下载 imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken imtoken bitget wallet telegram下载 quickq VPN trust wallet v2rayn imtoken