解决if..else嵌套过多问题(涉及职责链模式)

1.函数表

1)适用于逻辑表达模式相似

2)形式 :map<key, std::function<> > 

3)


#include <iostream>
#include <map>
#include <functional>
typedef int (*ifun)(int,int);
typedef double (*dfun)(double, double);
using namespace std;
//普通函数
double Add(double i, double j)
{
	return i + j;
 }

//函数类对象:c++标准库很多算法都是函数类对象
class Divide
{
public:
	double operator()(double i, double j )
	{
		return i / j;
	}
};

auto mul = [](double i, double j) {return i * j; };

int main()
{
	//只能存储普通函数,lambda和函数类对象无法存入
	std::map<std::string, double (*)(double, double)> binops;

	//c++11的function:无法存储重载函数,只能通过函数指针或lamada解决
	std::map<string, std::function<double(double, double) >> mp;
	mp.insert({ "+", Add });
	mp.insert({ "/", Divide()});
	mp.insert({ "*", mul });
	cout<<mp["+"](10, 2)<<endl;
	cout << mp["/"](10, 2) << endl;
	cout << mp["*"](10, 2) << endl;
}

2.职责链模式 

1)适用于逻辑表达模式不一样

2)实例

#include <iostream>
 
using namespace std;

//职责链重点在于设置接任者
class Handler
 {
 public:
	 Handler():_successor(nullptr){}
	 void setSuccessor(Handler *successor) { _successor = successor; }
	 virtual void handleRequest(int request) = 0;

 protected:
	 Handler *_successor;
 
 };

class Handler1 :public Handler
{
public:
	Handler1():_name("Handler1"){}

	virtual void handleRequest(int request) override
	{
		if (request > 0 && request <= 10)
		{
			//自己处理
			cout << _name << "处理结束" << endl;
		}
		else if(_successor)
		{
			//给接任者处理
			_successor->handleRequest(request);
		}
	}
private:
	string _name;
};

class Handler2 :public Handler
{
public:
	Handler2() :_name("Handler2") {}

	virtual void handleRequest(int request) override
	{
		if (request > 10 && request <= 20)
		{
			//自己处理
			cout << _name << "处理结束" << endl;
		}
		else if (_successor)
		{
			//给接任者处理处理
			_successor->handleRequest(request);
		}
	}
private:
	string _name;
};
int main()
{ 
	Handler *h1 = new Handler1();
	Handler *h2 = new Handler2();
	h1->setSuccessor(h2);
	h1->handleRequest(20);
	h1->handleRequest(3);
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值