还在为复杂的业务逻辑切换而头疼吗?面对不断变化的需求,是否感觉代码越来越臃肿,维护成本越来越高?
作为一名资深的C#开发者,我深知这种痛苦。今天就来分享一个真正实用的解决方案:策略模式。
不是那种教科书式的抽象讲解,而是一个完整的工业控制系统案例——从接口设计到UI实现,从异常处理到性能优化,手把手带你打造一个生产级别的WinForm应用。
看完这篇文章,你将掌握:如何用策略模式优雅地处理复杂业务场景,如何设计美观实用的工业级界面,以及那些踩过的坑和最佳实践。
想象一个工业生产控制系统,需要支持多种生产模式:
传统的if-else方式会让代码变得:
C#// ❌ 糟糕的实现方式
public void StartProduction(string mode, int quantity)
{
if (mode == "HighSpeed")
{
// 高速模式逻辑...
}
else if (mode == "Standard")
{
// 标准模式逻辑...
}
else if (mode == "Eco")
{
// 节能模式逻辑...
}
// 新增模式就要修改这里...
}
问题显而易见:

策略模式的精髓:将算法族封装起来,让它们可以互相替换。
C#// ✅ 策略接口定义
public interface IProductionStrategy
{
string StrategyName { get; }
ProductionResult Execute(int quantity, double workTime);
string GetDescription();
double GetEfficiency();
double GetPowerConsumption();
}
C#public class ProductionResult
{
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public int TargetQuantity { get; set; }
public int ActualQuantity { get; set; }
public double Efficiency { get; set; }
public double PowerConsumption { get; set; }
public string Status { get; set; }
public string StrategyUsed { get; set; }
public double WorkTime { get; set; }
public TimeSpan Duration => EndTime - StartTime;
public double QualityRate => (double)ActualQuantity / TargetQuantity * 100;
}
C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AppStrategyIndustrialControlSystem.Interfaces;
using AppStrategyIndustrialControlSystem.Models;
namespace AppStrategyIndustrialControlSystem.Strategies
{
public class HighSpeedStrategy : IProductionStrategy
{
public string StrategyName => "高速生产模式";
public ProductionResult Execute(int quantity, double workTime)
{
var result = new ProductionResult
{
StartTime = DateTime.Now,
TargetQuantity = quantity,
WorkTime = workTime,
StrategyUsed = StrategyName
};
// 高速模式:效率高,但功耗大
double efficiency = GetEfficiency();
double powerConsumption = GetPowerConsumption();
// 模拟生产过程
System.Threading.Thread.Sleep(1000); // 模拟处理时间
result.ActualQuantity = (int)(quantity * efficiency);
result.Efficiency = efficiency;
result.PowerConsumption = powerConsumption * workTime;
result.EndTime = DateTime.Now;
result.Status = result.ActualQuantity >= quantity * 0.95 ? "生产完成" : "需要调整";
return result;
}
public string GetDescription()
{
return "适用于紧急订单,最大化生产速度,功耗较高";
}
public double GetEfficiency()
{
return 0.98; // 98% 效率
}
public double GetPowerConsumption()
{
return 150.0; // 150kW/小时
}
}
}
C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AppStrategyIndustrialControlSystem.Interfaces;
using AppStrategyIndustrialControlSystem.Models;
namespace AppStrategyIndustrialControlSystem.Context
{
public class ProductionContext
{
private IProductionStrategy _strategy;
public ProductionContext(IProductionStrategy strategy)
{
_strategy = strategy;
}
public void SetStrategy(IProductionStrategy strategy)
{
_strategy = strategy;
}
public ProductionResult ExecuteProduction(int quantity, double workTime)
{
return _strategy?.Execute(quantity, workTime);
}
public IProductionStrategy GetCurrentStrategy()
{
return _strategy;
}
}
}



严格按照工业标准命名:
btncmbdgvnudC#private void InitializeData()
{
// ⚠️ 重要:正确的初始化顺序
InitializeStrategies(); // 1. 策略列表
InitializeContext(); // 2. 上下文
InitializeDataGridView(); // 3. 数据网格
SetDefaultStrategy(); // 4. 默认选项
}
private void cmbStrategy_SelectedIndexChanged(object sender, EventArgs e)
{
// 🛡️ 防御性编程
if (cmbStrategy.SelectedItem is IProductionStrategy selectedStrategy &&
_productionContext != null)
{
_productionContext.SetStrategy(selectedStrategy);
UpdateStrategyInfo(selectedStrategy);
}
}
问题:在Form构造函数中设置ComboBox选项时触发事件,但上下文还未初始化。
解决方案:
C#// ✅ 临时移除事件处理器
cmbStrategy.SelectedIndexChanged -= cmbStrategy_SelectedIndexChanged;
// 初始化操作...
// 重新添加事件处理器
cmbStrategy.SelectedIndexChanged += cmbStrategy_SelectedIndexChanged;
错误做法:
C#private readonly List<IProductionStrategy> _strategies; // ❌
正确做法:
C#private List<IProductionStrategy> _strategies; // ✅
C#private async void btnExecute_Click(object sender, EventArgs e)
{
btnExecute.Enabled = false;
pgbProgress.Visible = true;
try
{
// 🚀 异步执行,避免UI冻结
var result = await Task.Run(() =>
_productionContext.ExecuteProduction(quantity, workTime));
// 更新UI...
}
catch (Exception ex)
{
MessageBox.Show($"生产过程发生错误:{ex.Message}", "错误");
}
finally
{
btnExecute.Enabled = true;
pgbProgress.Visible = false;
}
}
运行时动态切换算法,无需修改客户端代码
新增策略只需实现接口,完全符合开闭原则
每个策略独立封装,单元测试更简单
消除大量if-else,提高代码可读性
C#public static class StrategyFactory
{
public static IProductionStrategy CreateStrategy(string strategyType)
{
return strategyType switch
{
"HighSpeed" => new HighSpeedStrategy(),
"Standard" => new StandardStrategy(),
"Eco" => new EcoModeStrategy(),
_ => throw new ArgumentException("未知策略类型")
};
}
}
C#// appsettings.json配置不同策略参数
{
"ProductionStrategies": {
"HighSpeed": {
"Efficiency": 0.98,
"PowerConsumption": 150.0
}
}
}
C#private static readonly Dictionary<string, IProductionStrategy> _strategyCache
= new Dictionary<string, IProductionStrategy>();
C#public interface IDataRepository
{
Task SaveProductionResultAsync(ProductionResult result);
Task<List<ProductionResult>> GetHistoryAsync(DateTime from, DateTime to);
}
C#public event EventHandler<ProductionEventArgs> ProductionStatusChanged;
private void NotifyProductionStatus(ProductionResult result)
{
ProductionStatusChanged?.Invoke(this, new ProductionEventArgs(result));
}
通过这个完整的工业控制系统案例,我们深入学习了策略模式的三个核心要点:
策略模式不仅仅是一个设计模式,更是一种编程思维。它教会我们如何面对复杂多变的业务需求,用优雅的代码架构来应对挑战。
在实际的C#开发中,策略模式几乎无处不在——从简单的算法切换到复杂的业务流程管理,都能看到它的身影。掌握了这个模式,你的代码质量将会有质的飞跃。
💬 互动交流
🔄 如果这篇文章对你有帮助,请转发给更多的C#开发同行,让我们一起提升代码质量!
🏷️ 标签:#C#开发 #设计模式 #WinForm开发 #策略模式 #编程技巧
相关信息
通过网盘分享的文件:AppStrategyIndustrialControlSystem.zip 链接: https://pan.baidu.com/s/1xaFnW1JLIl6rWk7Y9yzrnQ?pwd=8tah 提取码: 8tah --来自百度网盘超级会员v9的分享
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!