C++ &引用;接口“;类来访问基类的辅助计算

C++ &引用;接口“;类来访问基类的辅助计算,c++,design-patterns,C++,Design Patterns,我想知道如何最好地(在效率和可读性方面)实现一个设计模式,该模式包括一个基类和两个接口类(I1和I2),它们访问执行一些相对耗时的操作的类a 假设我们有一个基类a,它有一个方法: class A { // methods ... double computeValue(double in1, double in2, double& out1) { double result; /* Perform some very time consuming

我想知道如何最好地(在效率和可读性方面)实现一个设计模式,该模式包括一个基类和两个接口类(I1和I2),它们访问执行一些相对耗时的操作的类a

假设我们有一个基类a,它有一个方法:

class A {

  // methods ...

  double computeValue(double in1, double in2, double& out1) {


      double result;

      /* Perform some very time consuming computations with in1 and in2, 
         that leads to some intermediate values and the result */

      // Compute side product from those intermediate values that took so long
      // to obtain
      out1 = intermediate_value1 * intermediate_value2;

      return result;
  }

  // more methods and members

}
现在,假设我们有一个接口类(I1),它只对返回A的“结果”值感兴趣:

我可以用不同的方法拆分
computeValue
,问题是
out1
result
的值应该从完全相同的输入中派生出来(我不想重复执行
computeValue
,因为它在负载方面可能是一个“昂贵”的方法)

我想知道是否有任何设计模式可以帮助我实现这一点。任何帮助都将不胜感激


非常感谢

这两个接口应该由两个具有输入的不同客户端使用?@tobi303这两个接口将由同一客户端调用,因此将具有相同的输入。似乎函数
compute\u value
实际计算两个值。它可以重构为返回两个元素的元组,您可以使用
std::ignore
忽略任何一个调用中的一个元素。@hauron谢谢!但是我不应该调用computeValue两次吗?这就是我想要避免的,如果可能的话…@mgfernan你以前的方法也不会保护你。如果您希望避免调用它两次,请考虑缓存它:要么是单个“最后计算”的值,要么是一组这些-谷歌LRU缓存。您当然可以为这两个元素实现一个包装器结构,并将其移动(有点不相关,但查找命令设计模式)。这两个接口应该由两个具有输入的不同客户端使用?@tobi303这两个接口将由同一个客户端调用,因此,将具有相同的输入。似乎函数
compute\u value
实际计算两个值。它可以重构为返回两个元素的元组,您可以使用
std::ignore
忽略任何一个调用中的一个元素。@hauron谢谢!但是我不应该调用computeValue两次吗?这就是我想要避免的,如果可能的话…@mgfernan你以前的方法也不会保护你。如果您希望避免调用它两次,请考虑缓存它:要么是单个“最后计算”的值,要么是一组这些-谷歌LRU缓存。当然,您可以为这两个元素实现一个包装器结构,并将其移动(有点不相关,但可以查找命令设计模式),而不是缓存。
// Interface class to A
class I1 {

  public:

    // ctor, dtor, ...

    double getResult(){double in1, in2, out1; return pA_->computeValue(in1, in2, out1);}

  private:

    std::shared_ptr<A> pA_;
}
// Interface class to A
class I2 {

  public:

    double getResult(){double in1, in2, out1; pA_->computeValue(in1, in2, out1); return out1;}

  private:

    std::shared_ptr<A> pA_;
}