C++策略模式

Joh*_*0te 24 c++ design-patterns strategy-pattern

在过去,我已经看到策略模式被解释为一种机制,它允许函数/类的用户为该函数/类提供它们自己的功能.

我一直被告知,实现模式的方法是将函数指针引入类/函数并在内部调用它们,从而允许程序员提供自己的"策略",这些策略将由这些函数和对象在内部使用.

最近看,我看到策略模式似乎总是通过使用继承层次结构来解释/定义,如下所示:

战略模式实施

这是意见/实施的不同,还是功能指针传递的不是战略模式的变化?我最感兴趣所以当我评论或解释我的代码时,我不会混淆人们:)

fre*_*low 21

您只需在没有函数指针的语言中使用继承(读取:Java).

就个人而言,我更喜欢std::function原始函数指针,因为它接受更广泛的参数,并允许您在策略对象中维护状态.

此外,如果您已经在编译时知道策略,您甚至可以使用模板,从而节省了函数指针和std::function对象的空间和运行时开销.

  • 针对裸函数指针选择`std :: function`指出策略对象可以具有*state*.这是使用接口的真正要点:策略对象可以维护变量,而函数指针则不能. (5认同)
  • @Ernest:和往常一样,C++为您提供了一个选择.我只是在阐述各种可能性,因此w00te可以做出明智的选择.不幸的是,一些设计模式officionado不同意并立即投票让我失望. (3认同)

Naw*_*waz 17

在我看来,使用函数指针的策略模式的实现是在不支持OOP的语言(例如C)中完成的.

在支持OOP的语言中,使用类更好地实现:继承,虚函数(即运行时多态),接口等.通常,这是运行时策略模式,这意味着,您可以在运行时通过切换到其他策略模式来更改程序的行为.

在C++中,还有一种编译时策略模式,通常称为基于策略的设计.

在任何情况下,类都可以维护状态,而函数指针则不能.这是使用类的最大优势.

  • 一个天才正在贬低每个人,没有留下任何评论. (4认同)

Ern*_*ill 9

使用函数指针实现策略是基于继承的版本的退化情况.如您所知,模式的基本内核是能够在运行时提供或修改某个进程的组件.该组件可以是一个函数,也可以是一个对象.如果策略由几个位组成,则基于继承的版本确实更好,因为对象可以将多个方法打包在一起; 如果只有一个,那么函数指针就好了.