是否存在将“方法”与成员隔离的设计模式?

时间:2009-12-15 08:27:02

标签: c++ design-patterns

基本上,我希望有类似的东西:     class DataProcessor {     };

但是,将来,我需要将DataProcessor的实例传递给其他一些函数,因为DataProcessor包含一些关键数据。

我想到的是将成员与方法分开:

class DataProcessorCore{};
class DataProcessor : public DataProcessorCore    {};

这是完成这项工作的常用方法吗?或者有一些模式我可以将我的想法融入其中?

非常感谢

8 个答案:

答案 0 :(得分:7)

我不确定这是一种模式,我只想使用一个界面。

class DataProcessorCore {
   public virtual void doProcessing() = 0;

   // Any other virtual methods, but no implementation
};

class DataProcessor : public DataProcessorCore {
   // implement the methods
};

现在任何只需要DataProcessor功能的东西都应该使用接口类而不是具体类。如果我理解正确,那么这就实现了方法与方法的分离。

答案 1 :(得分:1)

起初我认为这是C#问题和扩展方法进入我的脑海,但当我发现这是C ++我试图找到类比,据我所知,这个类比是

  

参数依赖名称(Koenig)   查找

参考:

Extension Methods - A Polished C++ Feature

答案 2 :(得分:1)

也许战略模式是您正在寻找的。这将使您有机会在运行时更改处理数据的方法。

wiki: strategy pattern

答案 3 :(得分:1)

首先,我没有看到为什么你希望其他函数看到一个带有数据和没有方法的对象。传递通常类型的对象有什么问题,它有两个?

其次,该功能应该看到什么?具有全公共成员变量的对象?或者只有一个私有成员变量和更少的访问器/ mutator方法比DataProcessorCore?

C ++中一个相对常见的习惯用法是在对象之外放置尽可能多的方法。

所以你的解决方案可能是这样的:

class DataProcessor {
   // Fill in only the basics. Member variables and a small set of "core" functions to access/modify them.
};

void ComplexOperation(DataProcessor& proc) { ...}
float AnotherOperation(DataProcessor& proc, int i) { ...}

然后完全消除DataProcessorCore。您不需要它,因为您拥有包含数据的对象(并且我假设有一小组核心功能),并且所有更广泛的功能可以作为自由函数而不是在dereived类中实现。

标准库广泛使用这种技术。想想std::sort不是单个容器类的成员,而是一个可以在容器上调用的免费函数。

答案 4 :(得分:0)

仅提供getters()的接口?

答案 5 :(得分:0)

我不确定我到底知道你想要什么,但也许Decorator模式可以看一下。

  

附加装饰图案   对象的附加功能   动态。装饰者提供了一个   子类化的灵活替代方案   用于扩展功能。

Wiki : Decorator Pattern

答案 6 :(得分:0)

我认为我们可以通过结合继承和抽象模式来实现这一目标

interface Operations {
  public void printValue();
}

public class Data {

  private String value;

  protected void loadValues() {
   this.value = "somevalue";
  }

  protected String getValue() {
    return this.value;
  }
}

public class DataProvider extends Data implements Operations {
  public Operate() {
    super.load();
  }

  public void printValue() {
    System.out.println("Value is "+getValue());
  }
}

public class Consumer {
  public static void main() {
    Operations operate = (Operations) new DataProvider();
    operate.printValue();
  }
}

答案 7 :(得分:0)

正如Holger所说,适合的模式是战略,将处理数据的逻辑与数据结构本身分开。更多地了解他们尝试做什么将是有用的,模式出现,它们不适用。