在过去,我看到策略模式被解释为一种机制,允许函数/类的用户为该函数/类提供自己的功能。
我一直被告知,实现模式的方法是通过将函数指针放入类/函数并在内部调用它们,从而允许程序员提供自己的“策略”,这些“策略”将由这些函数和对象在内部使用。
最近环顾四周,我发现策略模式似乎总是通过使用继承层次结构来解释/定义,如下所示:
Strategy pattern implementation
这是观点/实现的不同,还是传递的函数指针实际上不是策略模式的变体?我最感兴趣的是,所以当我注释或解释我的代码时,我不会让人们感到困惑:)
发布于 2011-09-07 02:34:25
您只需在没有函数指针的语言中使用继承(read: Java)。
就我个人而言,我更喜欢std::function而不是原始函数指针,因为它接受更广泛的参数,并允许您维护策略对象中的状态。
此外,如果您已经知道编译时的策略,您甚至可以使用模板,从而节省函数指针和std::function对象的空间和运行时开销。
发布于 2011-09-07 02:37:05
在我看来,使用函数指针实现策略模式是在不支持OOP的语言(如C)中完成的。
在支持OOP的语言中,更好的实现方式是使用类:继承、虚函数(即运行时多态性)、接口等。通常,这是运行时策略模式,这意味着您可以在运行时通过切换到其他策略模式来更改程序的行为。
在C++中,还有一种通常称为的编译时策略模式。
在任何情况下,类可以维护状态,而函数指针不能。这是使用类的最大优势。
发布于 2011-09-07 02:38:33
使用函数指针来实现策略是基于继承的版本的一种退化情况。正如您所知道的,该模式的核心是能够在运行时提供或修改某个流程的组件。该组件可以是一个函数,也可以是一个对象。如果策略由几个比特组成,那么基于继承的版本会更好,因为一个对象可以将几个方法打包在一起;如果只有一个比特,那么函数指针也差不多。
https://stackoverflow.com/questions/7324479
复制相似问题