是否有任何设计模式可以避免嵌套开关盒?

use*_*770 3 c++ design-patterns switch-statement

我见过类似的线程,但是,不知道如何将解决方案完全应用到我的案例中.我的问题是我有一组用例可以说'A','B','C',当输入传递时需要执行某些命令(2个用例是输入)是列出的任何2个用例.例如:

switch(input1)
{
case A:
break;
case B:
break;
case C:
break;
}
Run Code Online (Sandbox Code Playgroud)

在每种情况下,我将不得不检查输入2,因此,最终的代码可能看起来像

switch(input1)
{
case A:
{
switch(input2):
case B:
break;
case c:
break;
}
case B:
{
switch(input2):
case A:
break;
case c:
break;
}
....

}
Run Code Online (Sandbox Code Playgroud)

我正在考虑使用(pair,command)的地图并删除这个开关案例,但有没有其他更好的解决方案或设计问题来解决这个问题?

Naw*_*waz 8

如果性能不是一个大问题,那么函数指针的映射可能是一个解决方案.

假设标签A,B,C...是小于整数值255.

请注意,您必须使用每对可能的输入设置调度程序.此外,如果对KEY(A,B)KEY(B,A)是相同的情况,那么您可以编写一个函数invoke来处理这种情况,以便为其余代码提供统一的用法.

 void invoke(int input1, int input2, /* args */)
 {
     if (dispatcher.find(KEY(input1, input2)) != dispatcher.end() )
           dispatcher[KEY(input1,input2)] (/* args */);
     else
           dispatcher[KEY(input2,input1)] (/* args */);
 }
Run Code Online (Sandbox Code Playgroud)

然后用它作为:

 invoke(input1, input2, /* args */);
 invoke(input2, input1, /* args */);  //still okay!
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.