c++ 职责链模式(Chain of Responsibility)
职 责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处 理它为止。其思想很简单,考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的数量 在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理形成 了一条链,直到有一个对象处理请求。给出这个例子的UML图。
#include <iostream> #include <string> using namespace std; class Manager { protected: Manager *m_manager; string m_name; public: Manager(Manager* manager,string name):m_manager(manager),m_name(name){} virtual void DealWithRequest(string name, int num) {} }; //经理 class CommonManager : public Manager { public: CommonManager(Manager* manager,string name):Manager(manager,name){} void DealWithRequest(string name,int num) { if(num < 500) { cout << "经理" <<m_name << "批准" << name << "加薪" << num << "元" <<endl; } else { cout << "经理" << m_name << "无法处理,交由总监处理" <<endl; m_manager->DealWithRequest(name,num); } } }; class Majordomo:public Manager { public: Majordomo(Manager *manager,string name):Manager(manager,name){} virtual void DealWithRequest(string name,int num) { if(num < 1000) { cout << "总监" <<m_name << "批准" << name << "加薪" << num << "元" <<endl; } else { cout << "总监" << m_name << "无法处理,交由总经理处理" <<endl; m_manager->DealWithRequest(name,num); } } }; class GeneralManager : public Manager { public: GeneralManager(Manager *manager,string name):Manager(manager,name){} void DealWithRequest(string name,int num) { cout << "总经理" <<m_name << "批准" << name << "加薪" << num << "元" <<endl; } };
客户端使用:
#include <iostream> #include "state.h" using namespace std; int main() { Manager *general = new GeneralManager(NULL,"a"); Manager *majordomo = new Majordomo(general,"b"); Manager *common = new CommonManager(majordomo,"c"); common->DealWithRequest("d",400); common->DealWithRequest("d",700); common->DealWithRequest("d",1200); system("pause"); return 0; }
说明:
1. 职责链的特点是:当客户提交一个请求时,请求是沿链传递直至有一个Manager对象负责处理它。
2. 职责链的好处是:请求者不用管哪个对象来处理,反正该请求会被处理。它只需保持一个后继者即可。
3. 要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当。