Rez*_*imi 11 c++ inheritance design-patterns strategy-pattern object-oriented-analysis
有一个相同的概念Strategy Pattern和Inheritance,这样我就可以实现Strategy Pattern与Inheritance这听起来很简单和清晰比Strategy Pattern.
Startegy Pattern:
class IBase
{
public:
virtual void processAction(void *data) = 0; // pure virtual
}
class Worker: public IBase
{
public:
virtual void processAction(void *data)
{
// define logic
}
}
Run Code Online (Sandbox Code Playgroud)
Inheritance:
class Base
{
public:
virtual void processAction(void *data) {}
}
class Worker: public Base
{
public:
virtual void processAction(void *data) override
{
// define logic
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是它们之间有什么区别?或什么时候应该使用Strategy Pattern或Inheritance?
链接:战略模式
JB *_*zet 20
想象一下,你设计了一个缓存.缓存可以有关于的选项
现在想象一下,您希望让缓存的用户选择这些选项中的任何一个,并使用继承.你需要3*2*2 = 12个不同的类:
4个LifoXxx类中的每一个都必须实现相同的算法来实现LIFO策略.其他的相同.
使用策略模式而不是继承来实现它,您将拥有一个Cache类和7个策略类(每个策略一个),您可以根据需要进行组合,而无需重复代码.
您还可以让您的缓存用户定义您自己的策略,这是您没有预料到的,并让他将其与其他策略结合起来,而无需创建大量新的子类.
策略是OOP的模式,继承是OOP的原则.策略是使用(或支持)继承(实际上是接口泛化)来实现的.
遗产
战略
而且,根据你的例子:
答案在您在问题中链接的维基百科文章中。
策略模式使用组合而不是继承。在策略模式中,行为被定义为单独的接口和实现这些接口的特定类。这允许在行为和使用该行为的类之间更好地解耦。可以在不破坏使用它的类的情况下更改行为,并且类可以通过更改使用的特定实现来在行为之间切换,而无需任何重大的代码更改。行为也可以在运行时和设计时更改。
如果您的情况是简单和静态的,您当然可以使用继承,但是使用 Strategy 可以让您更好地解耦复杂的代码,并允许在策略的实现之间进行简单的切换,即使在运行时也是如此。
例子可能会有所帮助。这个相关问题的答案以及您的问题的其他答案中都有一些很好的答案。
您希望能够在运行时更改策略的一个非常真实的情况是排序。排序顺序可以因策略(通常称为比较器)而变化,并且您可以有多个策略和机制的实现,供程序用户更改它们。
| 归档时间: |
|
| 查看次数: |
5437 次 |
| 最近记录: |