/* 小鱼号的代码日志
* 设计模式
* 职责链模式
* 使用多个对象都有机会处理请求
* 从而避免请求的发送和接受之间的耦合关系
* 将这个对象连成一条链,并沿着这条链传递该请求
* 知道有一个对象处理它为止
* 实例:
* 学校采购金额审批流程
* < 3000 系主任审批
* 3000 - 5000 学院主任审批
* 5000 - 30000 副校长审批
* 30000 - 30000000 校长审批
* > 30000000 都没办法审批
*/
#include<iostream>
#include<string>
using namespace std;
///请求类
class PurchaseRequeset
{
public:
PurchaseRequeset(int price)
{
m_price = price;
}
int getPrice()
{
return m_price;
}
private:
int m_price; //审批金额
};
///请求的处理者
class Approver
{
public:
Approver(string name)
{
m_name = name;
}
void setNextApprover(Approver* nextApprover)
{
m_nextApprover = nextApprover;
}
///处理请求
virtual void processRequest(PurchaseRequeset req)
{
cout << "can not process Requese" << endl;
}
protected:
Approver* m_nextApprover; ///下一个处理者
string m_name;
};
///系主任 级别的处理者
class DepartmentApprover : public Approver
{
public:
DepartmentApprover(string name) :
Approver(name)
{
}
void processRequest(PurchaseRequeset req)
{
int price = req.getPrice();
if(price < 3000)
{
cout << "name:" << m_name << " process request $:" << price << endl;
}
else
{
cout << "name:" << m_name << " can not process request" << endl;
m_nextApprover->processRequest(req);
}
}
};
///学院主任 级别的处理者
class CollegeApprover : public Approver
{
public:
CollegeApprover(string name) :
Approver(name)
{
}
void processRequest(PurchaseRequeset req)
{
int price = req.getPrice();
if(price > 3000 && price < 5000)
{
cout << "name:" << m_name << " process request $:" << price << endl;
}
else
{
cout << "name:" << m_name << " can not process request" << endl;
m_nextApprover->processRequest(req);
}
}
};
///副校长 级别的处理者
class ViceSchoolMasterApprover : public Approver
{
public:
ViceSchoolMasterApprover(string name) :
Approver(name)
{
}
void processRequest(PurchaseRequeset req)
{
int price = req.getPrice();
if(price > 5000 && price < 30000)
{
cout << "name:" << m_name << " process request $:" << price << endl;
}
else
{
cout << "name:" << m_name << " can not process request" << endl;
m_nextApprover->processRequest(req);
}
}
};
///校长 级别的处理者
class SchoolMasterApprover : public Approver
{
public:
SchoolMasterApprover(string name) :
Approver(name)
{
}
void processRequest(PurchaseRequeset req)
{
int price = req.getPrice();
if(price > 30000 && price < 30000000)
{
cout << "name:" << m_name << " process request $:" << price << endl;
}
else
{
cout << "name:" << m_name << " can not process request" << endl;
m_nextApprover->processRequest(req);
}
}
};
///职责链模式
void testResponsibilityChain()
{
cout << "responsibility chain patterns" << endl;
PurchaseRequeset req(500000084);
Approver* pDepartmentApprover = new DepartmentApprover("department Director");
Approver* collegeApprover = new CollegeApprover("college director");
Approver* vicSchoolMasterApprover = new ViceSchoolMasterApprover("vic school master");
Approver* schoolMasterApprover = new SchoolMasterApprover("school master");
Approver* pApprover = new Approver("last approver");
///设置责任链
pDepartmentApprover->setNextApprover(collegeApprover);
collegeApprover->setNextApprover(vicSchoolMasterApprover);
vicSchoolMasterApprover->setNextApprover(schoolMasterApprover);
schoolMasterApprover->setNextApprover(pApprover);
///非环状 责任链 从最低级别开始处理请求
pDepartmentApprover->processRequest(req);
}
【C++设计模式】 职责链模式
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 职责链模式:一种行为型设计模式 应用场景:系统中会出现一些请求,而可以处理请求的处理者会有很多,如何将由适当的处理...
- “数据结构”模式 常常有一些组建在内部具有特定的数据结构,如果让客户程序依赖这些特定的数据结构,将极大的破坏组件的...
- 1 bind和function的发散思维-控制反转 依赖注入 引用http://www.cnblogs.com/w...