简介
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。
优点
降低耦合度,将请求的发送者和接收者解耦。
简化了对象,使得对象不需要知道链的结构。
增加新的具体处理者很方便,无须修改原有代码,只需要在客户端重新建链即可。
缺点
性能问题,每个请求都从头到尾遍历。
如果建链不当,可能会造成循环调用,这将导致系统陷入死循环
使用场景
在代码开发过程中,如果发现自己正在写很长的if-else代码或很长的switch-case代码时,不妨应用一下责任链模式。
代码如下:
#include <iostream>
#include <string>
#include <memory>
#include <iostream>
using namespace std;
//抽象处理者
class handler
{
public:
handler() { m_next_handler = NULL; }
virtual ~handler() {}
//设置下一个处理者
void set_next(handler *successor) { m_next_handler = successor; }
//处理请求
virtual void handle_requ(int money) = 0;
protected:
handler *m_next_handler;
};
//具体处理者、主管
class Director :public handler
{
public:
//处理请求
virtual void handle_requ(int money)
{
if (money <= 200)
{
cout << "我是主管,最高可批准200块经费!批准!" << endl;
}
else
{
m_next_handler->handle_requ(money);
}
}
};
//具体处理者、经理
class Manager :public handler
{
public:
//处理请求
virtual void handle_requ(int money)
{
if (money <= 400)
{
cout << "我是经理,最高可批准400块经费!批准!" << endl;
}
else
{
m_next_handler->handle_requ(money);
}
}
};
//具体处理者、老板
class Boss :public handler
{
public:
//处理请求
virtual void handle_requ(int money)
{
if (money <= 800)
{
cout << "我是老板,最高可批准800块经费!批准!" << endl;
}
else
{
cout << "你申请的经费太多,无法批准!" << endl;
}
}
};
///
int main()
{
std::cout << "start-up .." << std::endl;
handler *director = new Director;
handler *manager = new Manager;
handler *boss = new Boss;
//设置责任链
director->set_next(manager);
manager->set_next(boss);
director->handle_requ(100);
director->handle_requ(200);
director->handle_requ(300);
director->handle_requ(800);
director->handle_requ(1000);
std::cout << "done .." << std::endl;
return 0;
}
运行如下: