多开关箱设计模式
Multiple switch cases design pattern
我有多个开关语句
switch(condition1)
{
case 1:
doSomething;
break;
case 2:
doSomething;
break;
default
break;
}
--
switch(condition2)
{
case 1:
doSomething;
break;
case 2:
doSomething;
break;
default
break;
}
条件在未来可能会增加,例如条件3、条件4,即可能会有更多的切换语句。所以我需要可扩展性。
我想合并这些switch语句。我不想使用太多if,else条件。中间没有回流定子来中断流动。没有动态内存分配。没有多维数组。
例如。
result = someOperation(condition1, condition2, condition3...)
switch(result)
{
case 1:
doSomething;
break;
case 2:
doSomething;
break;
default
break;
}
具体来说,我想生成多个int的唯一组合。不希望进行字符串比较。我更喜欢在一些设计模式中隐藏整个功能(尽管我找不到)
条件在未来可能会增加,例如条件3、条件4,即可能会有更多的切换语句。所以我需要可扩展性。
[评论:]策略模式会起作用,但我将如何选择该选择哪种策略。
考虑一下:
class operation // strategy base
{
public:
virtual bool applies(int result) const = 0;
virtual void perform() = 0;
virtual ~operation() = 0;
};
class first_case: public operation // choose better name than first_case
{
public:
bool applies(int result) const override
{
return result == 1; // equivalent of "case 1:"
}
};
// other cases defined here
客户代码:
void do_stuff()
{
// std::vector<std::unique_ptr<operation>> operations; defined else-where
auto result = someOperation(condition1, condition2, condition3...);
for(auto &op: operations) // equivalent of your switch above
if(op.applies(result))
{
op.perform();
break;
}
}
基本上,您将策略选择标准实现为操作库上的虚拟API(并为每个操作专门化它)。
如果您需要一些可扩展的东西,也许您可以实现某种按条件结果索引的表,它存储指向代表条件结果调用的函数的指针。通过这种方式,您将获得可扩展的(您可以在运行时动态修改表)和高效的(嗯,不如switch
语句高效,但可能足以满足您的目的)
如果您必须为条件添加新代码(或者最后一段的解决方案不够有效),最有效的方法是编写一个小程序,为您生成switch
语句(也许在适当的位置生成#include
语句),并将此生成包含在自动构建过程中。
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 资源管理设计模式
- 用于在回调中调用解析器的设计模式
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 在这种情况下我应该使用哪种设计模式
- C++中物体改变识别的设计模式?
- 确保所有构造函数调用相同的函数 c++ 设计模式
- 需要实例化不同类/对象并在启动时确定的硬件插槽的设计模式
- 设计模式,以避免不必要地添加抽象函数以适应新功能
- 工厂设计模式优化
- 使用C++模板的数据映射器设计模式
- 为什么以及如何使用原型设计模式
- 具有多个继承共享一个资源的对象 - 寻找良好的设计模式
- 在C++中创建观察器设计模式的好方法
- 现代C++在多大程度上消除了对设计模式的需求?
- 对于存储另一个类所需信息的类,例如其构造,是否有设计模式?
- 下面抽象工厂设计模式的实现是正确的吗
- sql记录集函数的状态设计模式
- 多开关箱设计模式
- 是否有任何设计模式可以避免嵌套开关外壳