切换到策略模式/案例

  • 本文关键字:案例 模式 策略 c#
  • 更新时间 :
  • 英文 :


我有一个巨大的开关/案例语句,我想用策略模式替换它。每个语句都有执行特定逻辑的代码的极大和平。有没有人在这种情况下使用该模式的好例子,或者您还有其他很好的解决方案?

到目前为止我的解决方案

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,但每个案例都会变得小得多。

从您的简要描述来看,这听起来确实是使您的代码更简单、更易于维护的适当方法。

最新更新