为什么有人更喜欢静态策略而不是动态策略


#include <iostream>
class Strategy
{
public:
virtual void execute() = 0;
};
class Strategy1 : public Strategy
{
public:
virtual void execute() override { std::cout << "executed1n"; }
};
class Strategy2 : public Strategy
{
public:
virtual void execute() override { std::cout << "executed2n"; }
};
template <typename S>
class StaticStrategy
{
S strategy;
public:
void execute()
{
strategy.execute();
}
};
class DynamicStrategy
{
Strategy* strategy;
public:
DynamicStrategy(Strategy* strategy) : strategy(strategy) {}
void execute()
{
strategy->execute();
}
void setStrategy(Strategy* newStrategy)
{
delete strategy;
strategy = newStrategy;
}
~DynamicStrategy()
{
delete strategy;
}
};
int main()
{
StaticStrategy<Strategy1> staticStrategy;
staticStrategy.execute();
DynamicStrategy dynamicStrategy(new Strategy1{});
dynamicStrategy.execute();
dynamicStrategy.setStrategy(new Strategy2{});
dynamicStrategy.execute();
}

这里有一个用c++编写的静态和动态策略模式的例子。我想知道为什么有人会使用静态策略而不是动态策略。看起来动态的可以完成静态的所有工作,但也有更大的灵活性,因为策略可以在运行时更改。有人能给我举个例子吗,静态策略比动态策略更好?

静态版本严格意义上更强大,在某些方面更容易使用。

静态版本只要求S具有成员函数execute,而动态版本则要求用户继承Strategy

静态版本对分配策略或生存期没有要求,而在代码段中,动态版本需要堆分配。如果动态版本没有所有权,则可以在没有分配的情况下选择动态版本,在这种情况下,客户端必须关注Strategy生存期。

给定静态版本,想要进行堆分配的客户端可以擦除策略类型,以便使用单个策略类型进行堆分配。但是,给定上面的动态版本,客户端无法撤消对堆分配的要求。

静态版本对编译器来说是完全可见的,并且这些信息可用于优化。动态版本间接通过Strategy基类,因此除非编译器能够证明(或推测(正在使用的具体Strategy类,否则无法进行内联。

最新更新