网站后台 ftp,网站分站的实现方法,青岛海川建设集团有限公司网站,乐清网站开发文章目录 职责链模式的详细介绍C 代码示例C示例代码2 职责链模式的详细介绍
定义与概念 职责链模式#xff08;Chain of Responsibility Pattern#xff09;是一种行为型设计模式#xff0c;它旨在将请求的发送者和多个接收者解耦#xff0c;让多个对象都有机会处理请求 代码示例C示例代码2 职责链模式的详细介绍
定义与概念 职责链模式Chain of Responsibility Pattern是一种行为型设计模式它旨在将请求的发送者和多个接收者解耦让多个对象都有机会处理请求这些对象就像一条链一样依次传递请求直到有一个对象能够处理该请求为止。如果某个对象不能处理请求它会将请求转发给链上的下一个对象。
例如在一个员工请假审批系统中员工提交请假申请后可能先由小组长审批如果请假天数较多小组长无法审批就会将申请转交给部门经理审批若部门经理权限也不够还可能继续往上传递给更高层领导审批。这里的小组长、部门经理、高层领导等就构成了一条职责链每个角色都是链上的一环根据自己的审批权限来决定是否处理该请假申请这个请求。 角色构成及职责 抽象处理者Handler它定义了一个处理请求的接口通常包含一个抽象的处理请求方法以及设置下一个处理者的方法。这个抽象类是整个职责链的基础所有具体的处理者类都要继承自它。例如在上述请假审批示例中抽象处理者可以定义一个抽象的“审批请求”方法和“设置下一个审批者”的方法无论是小组长还是部门经理等具体审批角色对应的类都要遵循这个统一的接口规范。具体处理者ConcreteHandler是抽象处理者的子类实现了处理请求的具体逻辑。每个具体处理者会判断自己是否能够处理当前请求如果可以就进行处理如果不行就将请求传递给下一个处理者通过调用设置好的下一个处理者对应的处理请求方法。比如小组长这个具体处理者会根据自己能审批的请假天数范围来判断是否处理员工的请假申请若超出范围就把申请转交给部门经理这个下一个处理者。请求Request这是需要在职责链中传递并被处理的对象它包含了与请求相关的各种信息例如请假申请中的请假天数、请假事由等内容。 优点 降低耦合度请求的发送者不需要知道具体是哪个对象来处理请求它只需要将请求发送到职责链的起始端即可而各个具体处理者之间也只是通过链的方式依次传递请求相互之间的依赖关系比较松散便于系统的维护和扩展。增强灵活性可以动态地增加、删除或者重新排列职责链上的处理者比如在请假审批系统中如果公司组织结构调整增加了新的管理层级或者调整了审批权限只需要相应地修改或添加具体处理者类以及调整它们在链上的顺序就可以适应变化而不需要大规模改动整个系统的其他部分。便于分工协作不同的具体处理者可以专注于处理自己职责范围内的请求符合单一职责原则有利于代码的编写、测试以及后续的维护工作。 缺点 可能导致性能问题如果职责链比较长而且每个请求都需要遍历较长的链才能找到合适的处理者可能会消耗较多的时间和资源特别是在对性能要求较高的场景下这一点需要注意并合理优化。调试难度增加由于请求在多个对象之间传递当出现问题时确定是哪个环节的处理者出现故障或者错误的处理逻辑相对复杂一些不利于快速定位和解决问题。 应用场景 审批流程如前面提到的员工请假审批、费用报销审批等各种涉及多层级审批的场景不同层级的审批人员构成职责链根据审批权限来处理请求。事件处理系统在图形用户界面开发中比如鼠标点击事件、键盘按键事件等不同的控件或者组件可以按照一定的顺序构成职责链根据各自的功能和逻辑来判断是否处理这些事件比如先由按钮控件判断是否点击在自己范围内如果不是再由父容器等继续判断处理。客户服务系统客户提出的问题按照问题的类型、难度等可以在不同的客服人员或者部门之间传递例如一线客服先尝试解决简单问题解决不了就转交给专业技术部门等形成一条处理客户问题的职责链。
C 代码示例
以下是一个简单的模拟请假审批的 C 代码示例来体现职责链模式
#include iostream
#include string// 请求类这里模拟请假申请包含请假天数和请假事由
class LeaveRequest {
public:LeaveRequest(int days, const std::string reason) : m_days(days), m_reason(reason) {}int getDays() const { return m_days; }std::string getReason() const { return m_reason; }private:int m_days;std::string m_reason;
};// 抽象处理者类定义处理请求的接口以及设置下一个处理者的方法
class Handler {
public:Handler() : m_nextHandler(nullptr) {}virtual ~Handler() default;void setNextHandler(Handler* next) { m_nextHandler next; }virtual void handleRequest(LeaveRequest request) 0;protected:Handler* m_nextHandler;
};// 具体处理者 - 小组长类
class TeamLeader : public Handler {
public:void handleRequest(LeaveRequest request) override {if (request.getDays() 2) {std::cout Team leader approved the leave request for request.getReason() . Days: request.getDays() std::endl;} else if (m_nextHandler! nullptr) {m_nextHandler-handleRequest(request);}}
};// 具体处理者 - 部门经理类
class DepartmentManager : public Handler {
public:void handleRequest(LeaveRequest request) override {if (request.getDays() 5) {std::cout Department manager approved the leave request for request.getReason() . Days: request.getDays() std::endl;} else if (m_nextHandler! nullptr) {m_nextHandler-handleRequest(request);}}
};// 具体处理者 - 总经理类
class GeneralManager : public Handler {
public:void handleRequest(LeaveRequest request) override {std::cout General manager approved the leave request for request.getReason() . Days: request.getDays() std::endl;}
};int main() {LeaveRequest request1(1, Personal affairs);LeaveRequest request2(4, Sick leave);LeaveRequest request3(8, Family trip);TeamLeader teamLeader;DepartmentManager departmentManager;GeneralManager generalManager;teamLeader.setNextHandler(departmentManager);departmentManager.setNextHandler(generalManager);teamLeader.handleRequest(request1);teamLeader.handleRequest(request2);teamLeader.handleRequest(request3);return 0;
}在上述代码中
LeaveRequest 类作为请求对象封装了请假天数和请假事由等信息。Handler 类是抽象处理者定义了 handleRequest 方法用于处理请求以及 setNextHandler 方法来设置下一个处理者。TeamLeader、DepartmentManager 和 GeneralManager 分别是具体的处理者类它们继承自 Handler 类在 handleRequest 方法中根据自己的审批权限这里以请假天数衡量来决定是处理请求还是将请求传递给下一个处理者。在 main 函数中创建了不同的请求对象以及各个具体处理者对象并将它们连接成职责链通过 setNextHandler 方法然后将请求依次发送到职责链的起始端这里是小组长由职责链上的处理者根据自身规则来处理请求。
C示例代码2
#includeiostream
#includestring
using namespace std;
//请求
class request
{
public:string type;//类型int count;//数量string content;//内容
public:request(string m_type, int len ,string m_content):type(m_type),count(len),content(m_content){}
};
//抽象管理类
class Manger
{
protected:string m_name;Manger *super;
public:Manger(string name):m_name(name){}virtual void setsuper(Manger *m_super){super m_super;}virtual void requestapplication(request m_request){}
};
//经理
class jingli:public Manger
{
public:jingli(string name):Manger(name){}void requestapplication(request m_request){if(m_request.type请假 m_request.count3){coutm_name: m_request.content数量m_request.count 批准endl;}else{super-requestapplication(m_request);}}
};
//主管
class zhuguan:public Manger
{
public:zhuguan(string name):Manger(name){}void requestapplication(request m_request){if(m_request.type请假 m_request.count5){coutm_name: m_request.content数量m_request.count 批准endl;}else{super-requestapplication(m_request);}}
};
//总经理
class zongjingli:public Manger
{
public:zongjingli(string name):Manger(name){}void requestapplication(request m_request){if(m_request.type请假 m_request.count10){coutm_name: m_request.content数量m_request.count 批准endl;}else{coutm_name: m_request.content数量m_request.count 不批准endl;}}
};
int main()
{request *myrequest new request(请假 ,6,小明请假);jingli *m_jingli new jingli(经理);zhuguan*m_zhuguan new zhuguan(主管);zongjingli *m_zongjingli new zongjingli(总经理);m_jingli-setsuper(m_zhuguan);m_zhuguan-setsuper(m_zongjingli);m_jingli-requestapplication(*myrequest);myrequest-count100;coutendl;m_jingli-requestapplication(*myrequest);myrequest-count1;coutendl;m_jingli-requestapplication(*myrequest);return 0;
}