反向可访问逻辑的模式变化?

时间:2011-07-21 18:41:49

标签: c# design-patterns

我正在尝试找到一个设计模式或最佳实践,或者在我的应用程序中保留业务逻辑版本的问题的其他解决方案。具体来说,我希望找到一种方法来确定用于发布保险单的逻辑。

我目前的代码如下:

public double FixedDeductibleSurchageAmount()
{
    double percent = FixedDeductibleSurchargePercent();
    double base_premium = CollisionPremium() + TheftPremium();
    return (base_premium * percent);
}

我需要对业务逻辑进行更改,以便此函数看起来更像:

public double FixedDeductibleSurchageAmount()
{
    double percent = FixedDeductibleSurchargePercent();
    double base_premium = CollisionPremium() + TheftPremium() + MedicalPremium();
    return (base_premium * percent);
}

我遇到麻烦的地方是现有的政策应该与先前的逻辑相比。这有设计模式吗?如果没有,有没有很好的方法来实现它?

5 个答案:

答案 0 :(得分:2)

策略模式听起来最适用。可能你需要一个工厂方法或一些这样的方法,它需要一个日期来返回适当的策略。

答案 1 :(得分:0)

您将不得不使用某种形式的其他数据来准确跟踪用于获取数据的算法;您可能需要更改持久性表示以维护有关用于派生结果的算法的版本信息。

答案 2 :(得分:0)

顺便说一句,您可能会考虑将像MedicalPremium或TheftPremium这样的东西设为Get-only属性,而不是无参数函数。他们非常适合这种范式。

您可以通过多种方式解决此问题。一些例子:

1)切换到新代码并向用户数据添加一个标志,以便MedicalPremium自动为旧用户返回0。如果以XML格式存储数据,这一点尤为简单;旧数据不会有标志,并且它不会影响数据的反序列化,因为XML是灵活的。

2)使包含函数MedicalPremium的类成为基类,并使MedicalPremium成为虚拟类。在派生类中重写它,这是您的新版本。较新的用户是派生类。旧用户被创建为基类。对于旧用户,它总是返回0.属性也可以像函数一样虚拟。

答案 3 :(得分:0)

是的,有:the Decorator Pattern。您可以使用它来扩展具有其他包装类的类的行为。在下面的示例中,我将其与模板方法模式相结合,以实现我相信您正在寻找的内容。

public class BaseSurchargePolicy {
    protected abstract double BasePremium { get; }
    protected abstract double FixedDeductibleSurchargePercent { get; }
    public double FixedDeductibleSurchageAmount{
      get
      {
        return (BasePremium * FixedDeductibleSurchargePercent);
      }
    }

    protected ICollection<string> _ProcessorsUsed;
    public IEnumerable<string> ProcessorsUsed 
    { 
      get { return ProcessorsUsed; }
    }
}

public class OldSurchargePolicy : BaseSurchargePolicy 
{

    protected double BasePremium 
    { 
        _ProcessorsUsed.Add(GetType().Name);
        return CollisionPremium + TheftPremium; 
    }
    protected double FixedDeductibleSurchargePercent { get; set; }

    public double CollisionPremium { get; set; }
    public double TheftPremium { get; set; }
}

public class MedicalSurchargeDecorator: BaseSurchargePolicy
{
    private BaseSurchargePolicy _wrapped;
    private double _medicalPremium;
    public MedicalSurchargeDecorator(BaseSurchargePolicy wrapped, double medicalPremium) 
    {
        _wrapped = wrapped;
        _medicalPremium = medicalPremium;
    }

    protected double BasePremium 
    { 
      get 
      {
        _ProcessorsUsed.Add(GetType().Name);
        return _wrapped.BasePremium + _medicalPremium; 
      }
    }
    protected double FixedDeductibleSurchargePercent { 
      get { return _wrapped.FixedDeductibleSurchargePercent }
    }

}

答案 4 :(得分:0)

如果您有机会看看Martin Fowler的企业架构模式,他会谈到个别实例方法,这些方法与您所拥有的方法并不完全相同,但非常相似。无论如何,这本书都很棒。

与此同时,我认为你可能不得不开始考虑你的函数也是数据,并在你的数据库中存储使用了哪个函数。您不需要(但可能需要)存储函数文本,但是您需要足够的信息来确定在运行时调用哪种方法。你问过模式,显然你有一个策略模式在这里,你可以参考,但我不知道它是否会特别有用。