多个开关盒设计模式

时间:2015-06-30 08:29:04

标签: c++ switch-statement

我有多个切换语句

switch(condition1)
{
 case 1:
  doSomething;
  break;

 case 2: 
  doSomething;
  break;

 default
  break;
}

-

 switch(condition2)
 {
  case 1:
   doSomething;
   break;

 case 2: 
  doSomething;
  break;

 default
  break;
 }

未来的条件会增加,例如。 condition3,condition4,即更多的switch语句可以在那里。所以我需要可扩展性。

我想合并这些switch语句。 我不想使用很多if,else条件。 两者之间没有返回声明来打破流量。 没有动态内存分配。 没有多维数组。

例如

result = someOperation(condition1, condition2, condition3...)

switch(result)
{
  case 1:
   doSomething;
   break;

 case 2: 
  doSomething;
  break;

 default
  break;

}

具体来说,我想生成多个整数的唯一组合。 不想要字符串比较。 我更喜欢在某些设计模式中隐藏整个功能(但我无法找到它。)

2 个答案:

答案 0 :(得分:1)

  

未来的条件会增加,例如。 condition3,condition4,即更多的switch语句可以在那里。所以我需要可扩展性。

     

[评论:]战略模式将起作用,但我将如何选择哪种策略。

考虑一下:

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(并为每个操作专门化它)。

答案 1 :(得分:0)

如果你需要一些可伸缩的东西,也许你可以实现某种表,由条件结果索引,它存储一个指向要代表条件结果调用的函数的指针。通过这种方式,您可以获得可扩展的内容(您可以在运行时动态修改表)并且高效(嗯,不如switch语句那么高效,但可能足以满足您的需要)

如果您必须为条件添加新代码(或者最后一段解决方案不够有效),最有效的方法是编写一个为您生成switch语句的小程序(也许#include它在适当的地方),并将这一代包含在自动构建过程中。