介绍
- 抽象处理者 Handler
定义一个请求的处理方法handleMessage,唯一对外开放的方法;定义一个链的编排方法setNext,设置下一个处理者;定义了具体的请求者必须实现的两个方法:定义自己能够处理的级别getHandlerLevel和具体的处理任务echo - 具体处理者 ConcreteHandler
实现抽象方法 - 请求发出者Client
发出请求
优点: 请求和处理分开
缺点:
- 性能问题,每个请求都是从链头遍历到链尾,特别是在链比较长的时候。
- 调试不很方便,采用了类似递归的方式,调试的时候逻辑可能比较复杂
避免出现超长链的情况, 一般的做法是在Handler中设置一个最大节点数量, 在setNext方法中判断是否已经是超过其阈值, 超过则不允许该链建立, 避免无意识地破坏系统性能。
UML类图:
代码:
#ifndef SIMPLE_CHAIN_H
#define SIMPLE_CHAIN_H
#include <iostream>
#include <typeinfo>
using namespace std;
/**
* @brief The Handler class
* Handler类,定义一个处理请示的接口。
*/
class Handler
{
public:
//设置并返回继任者
Handler * setSuccessor(Handler *successor)
{
m_successor = successor;
return m_successor;
}
virtual void handleRequest(int request) = 0;
protected:
Handler *m_successor;
};
/**
* @brief The ConcreteHandler1 class
* ConcreteHandler1,当请求数在0到10之间则有权处理,否则转到下一位。
*/
class ConcreteHandler1 : public Handler
{
public:
void handleRequest(int request) override
{
if( request >=10 && request <20)
{
cout<<typeid(this).name()<<"处理请求 :"<<request<<endl;
}
else if(m_successor != nullptr )
{
m_successor->handleRequest(request);
}
}
};
/**
* @brief The ConcreteHandler2 class
* ConcreteHandler2,当请求数在10到20之间则有权处理,否则转到下一位。
*/
class ConcreteHandler2 : public Handler
{
public:
void handleRequest(int request) override
{
if( request >=0 && request <10)
{
cout<<typeid(this).name()<<"处理请求 :"<<request<<endl;
}
else if(m_successor != nullptr )
{
m_successor->handleRequest(request);
}
}
};
/**
* @brief The ConcreteHandler3 class
* ConcreteHandler3,当请求数在20到30之间则有权处理,否则转到下一位。
*/
class ConcreteHandler3 : public Handler
{
public:
void handleRequest(int request) override
{
if( request >=20 && request <30)
{
cout<<typeid(this).name()<<"处理请求 :"<<request<<endl;
}
else if(m_successor != nullptr )
{
m_successor->handleRequest(request);
}
}
};
#endif // SIMPLE_CHAIN_H
加薪示例代码:
UML类图:
代码:
#ifndef SALARY_INCREASE_H
#define SALARY_INCREASE_H
#include <iostream>
#include <typeinfo>
using namespace std;
class Request
{
public:
string getRequestType() const
{
return m_requestType;
}
void setRequestType(string reqType)
{
m_requestType = reqType;
}
void setRequestContent(string reqContent)
{
m_requestContent = reqContent;
}
string getRequestContent() const
{
return m_requestContent;
}
void setNumber(int num)
{
m_number = num;
}
int getNumber() const
{
return m_number;
}
private:
//申请类别
string m_requestType;
//申请内容
string m_requestContent;
//数量
int m_number;
};
class Manager
{
public:
Manager(string name)
{
m_name = name;
}
//设置管理者上级
void setSuperior(Manager *superior)
{
m_superior = superior;
}
//申请请求
virtual void requestApplications(Request *request ) = 0;
protected:
string m_name;
Manager *m_superior;
};
//经理
class CommonManager : public Manager
{
public:
CommonManager(string name)
:Manager(name)
{
}
void requestApplications(Request *request) override
{
if( request->getRequestType() == "请假" && request->getNumber() <= 2)
{
cout<<m_name<<" : "<<request->getRequestContent()<<" 数量: "<<request->getNumber()<<" 被批准"<<endl;
}
else
{
if ( m_superior != nullptr)
m_superior->requestApplications(request);
}
}
};
/**
* @brief The Majordomo class
* 总监
*/
class Majordomo : public Manager
{
public:
Majordomo(string name)
:Manager(name)
{
}
void requestApplications(Request *request) override
{
if( request->getRequestType() == "请假" && request->getNumber() <= 5)
{
cout<<m_name<<" : "<<request->getRequestContent()<<" 数量: "<<request->getNumber()<<" 被批准"<<endl;
}
else
{
if ( m_superior != nullptr)
m_superior->requestApplications(request);
}
}
};
/**
* @brief The GeneralManager class
* 总经理
*/
class GeneralManager : public Manager
{
public:
GeneralManager(string name)
:Manager(name)
{
}
void requestApplications(Request *request) override
{
if( request->getRequestType() == "请假" )
{
cout<<m_name<<" : "<<request->getRequestContent()<<" 数量: "<<request->getNumber()<<" 被批准"<<endl;
}
else if(request->getRequestType() == "加薪" && request->getNumber() <= 5000)
{
cout<<m_name<<" : "<<request->getRequestContent()<<" 数量: "<<request->getNumber()<<" 被批准"<<endl;
}
else if(request->getRequestType() == "加薪" && request->getNumber() > 5000)
{
cout<<m_name<<" : "<<request->getRequestContent()<<" 数量: "<<request->getNumber()<<" 再说吧"<<endl;
}
else
{
cout<<"没有该类处理"<<endl;
}
}
};
#endif // SALARY_INCREASE_H