在平时使用if-else的时候如果业务逻辑比较多分枝比较多就会出现if-else很多。这是时候不方便阅读和维护以及后续添加新的功能。下面罗列一下简单方法(格式优化、改为三元表达式、改为逻辑直接封装到函数等这些不予以说明)。
1、采用Map的方式。
关键字对应原来的表达式,值对应的要执行的函数。我简单放到了一个类里面实现的
#include <QObject>
#include <QMap>
#include <QString>
#include <iostream>
using namespace std;
void func_test(int a)
{
cout << "func_test a:" << a << endl;
}
void func_test2(int a)
{
cout << "func_test2 a:" << a*2 << endl;
}
class test
{
public:
test(QObject *parent = NULL)
{
m_funcmap.insert("func_test", func_test);
m_funcmap.insert("func_test2", func_test2);
}
~test(){}
void execCmd(QString cmd, int v)
{
//use
if (m_funcmap.keys().contains(cmd))
{
m_funcmap.value("func_test")(v);
}
else
{
cout << "no find cmd :" << cmd.toStdString() << endl;
}
}
private:
typedef void (*func)(int a);
QMap<QString, func> m_funcmap;
};
使用如下
test t;
t.execCmd("func_test", 1);
t.execCmd("func_test3",3);
2、利用责任链模式模式。
(按照我自己的理解)一个公用类里面实现所有的if-esle的功能,并且功能是分割到不同的函数里,执行的时候调用所有的函数。
class ChainPatternDemo
{
public:
ChainPatternDemo(){}
void execCmd(QString cmd, int v)
{
chain_test1(cmd, v);
chain_test2(cmd, v);
chain_test3(cmd, v);
}
private:
void chain_test1(QString cmd , int v )
{
if (cmd == "chain_test1")
{
cout << "chain_test1 cmd :" << cmd.toStdString() << " " << v*1 << endl;
}
}
void chain_test2(QString cmd, int v )
{
if (cmd == "chain_test2")
{
cout << "chain_test2 cmd :" << cmd.toStdString() << " " << v*2 << endl;
}
}
void chain_test3(QString cmd, int v )
{
if (cmd == "chain_test3")
{
cout << "chain_test1 cmd :" << cmd.toStdString() << " " << v*3 << endl;
}
}
};
ChainPatternDemo chain;
chain.execCmd("chain_test1",2);
chain.execCmd("chain_test3",2);
3、利用工厂模式或者服务定位器模式
这两个模式的精髓还是在利用key快速找要执行的函数(或者类的方法)。
相关设计模式参考 工厂模式 | 菜鸟教程 (runoob.com)