职责链模式(ChainOfResponsibity)

来源:互联网 发布:java高级程序员笔试题 编辑:程序博客网 时间:2024/06/06 10:54

1.目的

   对于某个请求(Request),需要有多个对象(Manager)来依次处理,他们都有处理请求的接口,当一个对象处理不了的时候,需要自动的转给另外一个对象处理,这个时候就可以使用职责链模式


2.代码

ChainOfResponsibity.h

#ifndef CHAINOFRESPONSIBILITY_H_#define CHAINOFRESPONSIBILITY_H_#include <string>enum RequestType{LEAVE,RAISES};class Request{public:Request(RequestType, int, std::string);RequestType getType();int getNum();std::string getName();private:RequestType type;int num;std::string name;};class Manager{public:Manager();virtual ~Manager();void setSuperior(Manager&);void applyRequest(Request&);private:virtual bool handleRequest(Request&)=0;virtual std::string getTitle()=0;Manager* superior;};class CommonManager:public Manager{public:bool handleRequest(Request&);std::string getTitle();};class Director:public Manager{public:bool handleRequest(Request&);std::string getTitle();};class GeneralManager:public Manager{public:bool handleRequest(Request&);std::string getTitle();};#endif /* CHAINOFRESPONSIBILITY_H_ */

ChainOfResponsibity.cpp

#include "ChainOfResponsibility.h"#include <iostream>using namespace std;Request::Request(RequestType type, int num, string name):type(type), num(num), name(name){}RequestType Request::getType(){return type;}int Request::getNum(){return num;}string Request::getName(){return name;}Manager::Manager():superior(NULL){}Manager::~Manager(){}void Manager::setSuperior(Manager& superior){this->superior = &superior;}void Manager::applyRequest(Request& req){if(handleRequest(req)){cout<<getTitle()<<" : "<<req.getName()<<" Requests "<<req.getType()<<" "<<req.getNum()<<" approve!"<<endl;}else if(NULL != superior){superior->applyRequest(req);}else{cout<<getTitle()<<" : "<<req.getName()<<" Requests "<<req.getType()<<" "<<req.getNum()<<" not approve!"<<endl;}}bool CommonManager::handleRequest(Request& req){return (LEAVE == req.getType() && req.getNum() <= 2);}string CommonManager::getTitle(){return "CommonManager";}bool Director::handleRequest(Request& req){return (LEAVE == req.getType() && req.getNum() <= 5);}string Director::getTitle(){return "Director";}bool GeneralManager::handleRequest(Request& req){return (LEAVE == req.getType() || (RAISES == req.getType() && req.getNum() <= 500));}string GeneralManager::getTitle(){return "GeneralManager";}void chainofresponsibility(){Request q1(LEAVE, 2, "Tom");Request q2(LEAVE, 4, "Jim");Request q3(RAISES, 500, "Jerry");Request q4(RAISES, 800, "Jane");CommonManager cm;Director dr;GeneralManager gm;cm.setSuperior(dr);dr.setSuperior(gm);cm.applyRequest(q1);cm.applyRequest(q2);cm.applyRequest(q3);cm.applyRequest(q4);}



0 0