是否可以在没有动态多态性的情况下在 C++ 中实现状态设计模式?
Is it possible to implement the state design pattern in C++ without dynamic polymorphism?
假设我有以下 C++ 代码
class ControlAlgorithm {
public:
virtual void update() = 0;
virtual void enable() = 0;
virtual void disable() = 0;
};
class Algorithm_A : public ControlAlgorithm {
public:
void update();
void enable();
void disable();
};
class Algorithm_B : public ControlAlgorithm {
public:
void update();
void enable();
void disable();
};
Algorithm_A algorithm_A;
Algorithm_B algorithm_B;
ControlAlgorithm *algorithm;
假设我想在 运行 期间根据一些外部事件在 algorithm_A
和 algorithm_B
之间切换(基本上我将实施状态设计模式) .所以 algorithm
指针指向 algorithm_A
或 algorithm_B
对象。我的问题是是否有任何方法如何在 运行 时间内实现在算法之间动态切换的能力,而无需虚拟方法
通用接口,例如奇怪的重复模板模式?
您可以使用 composition over inheritance。例如,如下所示。
#include <iostream>
#include <functional>
struct control_algorithm {
const std::function<void()> update;
const std::function<void()> enable;
const std::function<void()> edit;
};
control_algorithm make_algorithm_A() {
return {
[]() { std::cout << "update A\n"; },
[]() { std::cout << "enable A\n"; },
[]() { std::cout << "edit A\n"; },
};
}
control_algorithm make_algorithm_B() {
return {
[]() { std::cout << "update B\n"; },
[]() { std::cout << "enable B\n"; },
[]() { std::cout << "edit B\n"; },
};
}
int main()
{
auto algorithm_A = make_algorithm_A();
auto algorithm_B = make_algorithm_B();
auto control = algorithm_A;
//auto control = algorithm_B;
}
假设我有以下 C++ 代码
class ControlAlgorithm {
public:
virtual void update() = 0;
virtual void enable() = 0;
virtual void disable() = 0;
};
class Algorithm_A : public ControlAlgorithm {
public:
void update();
void enable();
void disable();
};
class Algorithm_B : public ControlAlgorithm {
public:
void update();
void enable();
void disable();
};
Algorithm_A algorithm_A;
Algorithm_B algorithm_B;
ControlAlgorithm *algorithm;
假设我想在 运行 期间根据一些外部事件在 algorithm_A
和 algorithm_B
之间切换(基本上我将实施状态设计模式) .所以 algorithm
指针指向 algorithm_A
或 algorithm_B
对象。我的问题是是否有任何方法如何在 运行 时间内实现在算法之间动态切换的能力,而无需虚拟方法
通用接口,例如奇怪的重复模板模式?
您可以使用 composition over inheritance。例如,如下所示。
#include <iostream>
#include <functional>
struct control_algorithm {
const std::function<void()> update;
const std::function<void()> enable;
const std::function<void()> edit;
};
control_algorithm make_algorithm_A() {
return {
[]() { std::cout << "update A\n"; },
[]() { std::cout << "enable A\n"; },
[]() { std::cout << "edit A\n"; },
};
}
control_algorithm make_algorithm_B() {
return {
[]() { std::cout << "update B\n"; },
[]() { std::cout << "enable B\n"; },
[]() { std::cout << "edit B\n"; },
};
}
int main()
{
auto algorithm_A = make_algorithm_A();
auto algorithm_B = make_algorithm_B();
auto control = algorithm_A;
//auto control = algorithm_B;
}