gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:48:04 25 4
gpt4 key购买 nike

#include <iostream>

class Strategy
{
public:
virtual void execute() = 0;
};

class Strategy1 : public Strategy
{
public:

virtual void execute() override { std::cout << "executed1\n"; }
};

class Strategy2 : public Strategy
{
public:

virtual void execute() override { std::cout << "executed2\n"; }
};

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 否则内联不会发生。正在使用的类。

关于c++ - 为什么有人更喜欢静态策略而不是动态策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61414056/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com