设计模式C++版:第十五式职责链模式

来源:互联网 发布:域名dns劫持 编辑:程序博客网 时间:2024/06/05 02:49

职责链模式:使多个对象都有机会处理请求,从而便面请求发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着链条传递该请求,直到有一个对象处理它为止。类似状态模式。接收者和发送者都没有对方的明确信息,且链中的对象,自己也不知道链的结构。职责链可以简化对象的相互连接,仅保持一个后继者的引用,而不需保持须有接收者的引用。大大降低了耦合度。    需要注意的是,他和状态模式一样,有可能到了链的末端,请求都没处理。


include<string>using std::string;class Request{public:void setnum(int num){m_num = num;}int getnum(){return m_num;}private:int m_num;};class Manager{public://外部可以调用Manager(string name) :m_name(name){}virtual ~Manager(){}virtual void setsuperior(Manager*manager){this->m_superior = manager;}virtual void requestdeal(Request request){}protected:     //受保护被继承string m_name;Manager * m_superior;};//经理class CommanManager:public Manager{public://外部可以调用CommanManager(string name) :Manager(name){}virtual void requestdeal(Request request){if (request.getnum()<=2){printf("%d,%s可以批准\n",request.getnum(),m_name.c_str());} else{printf("%d,%s处理不了,向上传达\n", request.getnum(), m_name.c_str());if (m_superior !=nullptr){m_superior->requestdeal(request);}}}};//总监class MajorManager :public Manager{public://外部可以调用MajorManager(string name) :Manager(name){}virtual void requestdeal(Request request){if (request.getnum() <= 7){printf("%d,%s可以批准\n",request.getnum() ,m_name.c_str());}else{printf("%d,%s处理不了,向上传达\n", request.getnum(),m_name.c_str());if (m_superior != nullptr){m_superior->requestdeal(request);}}}};//总经理class GeneralManager :public Manager{public://外部可以调用GeneralManager(string name) :Manager(name){}virtual void requestdeal(Request request){printf("我是%s,所有天数都可以批准\n", m_name.c_str());}};int main(){CommanManager jingli("经理");MajorManager zongjian("总监");GeneralManager zjli("总经理");//注册上级jingli.setsuperior(&zongjian);zongjian.setsuperior(&zjli);Request reques;reques.setnum(15);jingli.requestdeal(reques);return 0;}


原创粉丝点击