切换到策略模式/案例
本文关键字:案例 模式 策略 | 更新日期: 2023-09-27 18:34:30
我有一个巨大的开关/案例语句,我想用策略模式替换它。每个语句都有执行特定逻辑的代码的极大和平。有没有人在这种情况下使用该模式的好例子,或者您还有其他很好的解决方案?
到目前为止我的解决方案
class Context
{
private readonly List<CalculationUnit> _calculationsUnits;
public Context()
{
_calculationsUnits = new List<CalculationUnit>()
{
new CalculationUnitA("calc1"),
new CalculationUnitB("calc2"),
new CalculationUnitC("calc2")
};
}
public int Calculate(string name)
{
return (from c in _calculationsUnits where c.Name.Equals(name) select c.Calculate()).FirstOrDefault();
}
}
class CalculationUnit
{
public string Name { get; private set; }
public CalculationUnit(string name)
{
Name = name;
}
public virtual int Calculate()
{
return 0;
}
}
class CalculationUnitA : CalculationUnit
{
public CalculationUnitA(string name) : base(name) { }
public override int Calculate()
{
//calculations logic A
}
}
class CalculationUnitB : CalculationUnit
{
public CalculationUnitB(string name) : base(name) { }
public override int Calculate()
{
//calculations logic A
}
}
class CalculationUnitC : CalculationUnit
{
public CalculationUnitC(string name) : base(name) { }
public override int Calculate()
{
//calculations logic A
}
}
但是,我最终将得到 50 个实现每个逻辑的类......
谢谢
策略模式通过将每个分支中的大段代码重构为单独的类(或方法(来提供帮助。然后,您的开关就变成了选择适当的策略类(或方法委托(的情况,然后在 switch 语句结束时通过单个调用执行。因此大致像这样:
switch (...)
{
case ...:
// Horrible logic;
break;
...
}
变成这样:
ILogicImplementer implementer;
switch (...)
{
case ...:
implementer = new FirstCaseImplementer();
break;
...
}
implementer.Implement();
您需要将逻辑重构为实现公共接口(或扩展公共基类(的一系列类,或重构为一系列具有兼容签名的方法,以便您的策略可以是选择匹配的委托。正如Oded在他的评论中所暗示的那样,你不一定会摆脱这样做select
,但每个案例都会变得小得多。
从您的简要描述来看,这听起来确实是使您的代码更简单、更易于维护的适当方法。