如何解决 if-else 过多的问题

在平时使用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);

c++ 将函数指针存入map中调用   。参考

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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值