设计模式:责任链
试想这样一个场景:小菜有一天想和经理说加薪的事情,经理说:“这件事我处理不了,需要交给人力总监从处理”。结果这个事情人力总监也处理不了,需要交给总经理处理。这样一个链式处理的过程就可以用责任链模式,当遇到自己不能处理的事情,就交给下一个尝试进行处理。
结构图
首先需要一个处理问题的接口,这个接口需要能够指定自己的下一个处理者式谁。ConcreteHandler1就是实例化的经理,可以设置他的下一个处理人是总监。这样当经理遇到自己不能处理的事情的时候,就可以抛给总监处理了。
一些思考
责任链模式类似与链表,每一个对象都需要指导下一级的对象是谁。这样在田间和删除相关环节是非常方便的。
代码
处理基类 (Handler)
class BaseHandler {
private:
BaseHandler* m_nextHandler;
public:
BaseHandler* setNext(BaseHandler* basehandler) {
m_nextHandler = basehandler;
return m_nextHandler;
}
virtual std::string handle(std::string request) {
if (m_nextHandler != nullptr) {//如果还有上级,就抛給上级解决
return m_nextHandler->handle(request);
}
else {
return "";
}
}
};
老板们 (concreteHandler)
class Boss1 :public BaseHandler {
public:
std::string handle(std::string request) override {
if (request=="人事调动") {
return "Boss1" + request + "----\n";
}
else {
return BaseHandler::handle(request);
}
}
};
class Boss2 :public BaseHandler {
public:
std::string handle(std::string request) override {
if (request == "涨薪") {
return "Boss2" + request + "----\n";
}
else {
return BaseHandler::handle(request);
}
}
};
主函数
void clientCode(BaseHandler* handler) {
std::list<std::string> problems = { "人事调动","涨薪","扯淡"};
for (const std::string& problem : problems) {
std::string result = handler->handle(problem);
if (result.empty()) {
std::cout << "处理结果:" << "无人处理\n";
}
else {
std::cout << "处理结果:" << result;
}
}
}
int main()
{
Boss1 boss1;
Boss2 boss2;
boss1.setNext(&boss2);
clientCode(&boss1);
clientCode(&boss2);
}
结果
总结
今天解决了小菜涨薪的问题,真是开心的一天啊。现在本菜做午饭了。