对于产生相同结果但采用不同参数的函数,有哪些设计模式?

时间:2018-03-14 15:43:22

标签: c# oop design-patterns

我继承了1000多行意大利面条代码。我可以将它分解为十几种方法,每种方法都创建一个FinancialTransactionObject,但是使用不同的日期,金额和其他参数来创建它们的事务。

我的直觉告诉我要让每个方法成为自己的类。所以我可以使用1个方法从基类或接口继承十几个类:

abstract FinancialTransactionObject Calculate();

并将参数移动到构造函数或将它们设置为公共属性。构造函数意味着我无法重用我的实例,每次都必须创建一个新对象。属性意味着消费代码可能忘记设置它们。在每个方法中保留参数只是在单独的文件中提供了十几种方法,并且不会感觉面向对象。

这个问题的变化似乎经常出现。是否有一个良好,一致,行业范围的设计模式来处理它?<​​/ p>

1 个答案:

答案 0 :(得分:0)

这对我来说听起来像Visitor pattern

访问者模式的基本思想是根据实现的类型动态地改变行为。

您需要两件事:

  1. IVisitable使用Accept方法,IVisitor为 参数。
  2. IVisitor,每个实现都有许多Visit个方法 IVisitable
  3. 我将从数字2开始。这个(在你的情况下)将是一个接口,它具有你的计算方法的所有实现(对于你提到的你想要创建的每个类)。让我们调用您的VisitorVisit方法CalculatorCalculate。然后你会有:

    interface ICalculator
    {
        FinancialTransactionObject Calculate(Element1 element);
        FinancialTransactionObject Calculate(Element2 element);
        FinancialTransactionObject Calculate(Element3 element);
        .
        .
    }
    

    然后第一部分 - 所有元素类将继承基类Element,它将实现IVisitable。然后是:

    abstract class Element
    {
        public FinancialTransactionObject result { get; private set; }
    
        protected void Accept(ICalculator calculator)
        {
            this.result = calculator.Calculate(this);
        }
    }
    

    你最终会得到类似的东西:

    var calculator = new Calculator(); //this is the class that implements the interface
    var el1 = new Element1();
    var el2 = new Element2();
    
    el1.Accept(calculator);
    el2.Accept(calculator);
    

    然后当然基于你的el对象的实现,将得到它们的结果值。

    我不确定这是你问题的最佳解决方案(如果有这样的话),但在我看来就像你正在寻找的那个。希望这会有所帮助。

    PS:我在考虑将IVisitable命名为ICalculatable,但这听起来很奇怪:)。