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);
}