设计模式之职责链模式实例(c++)

本文介绍了职责链模式的概念,通过一个审批假条的实例展示了如何在C++中应用该模式。文章详细阐述了如何创建请求类LeaveRequest,以及定义抽象处理者Leader接口和具体处理者Director、Manager、GeneralManager,它们沿职责链传递请求,由能处理的对象进行处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

职责链模式

职责链模式避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

职责链模式实例之审批假条

 从类图可知,Direcor、Manager、GeneralManager泛化继承并实现了Leader的handleRequest接口,当具体处理者无法处理请求的时候,会传递给下家successor(上级)来处理,谁能处理就交给谁处理,不能处理就将请求传递给上级,从而形成一条职责链。

下面是c++版本的实现

请求类LeaveRequest

//请求类LeaveRequest
class LeaveRequest{
public:
	LeaveRequest(string leaveName,int leaveDays){
		this->leaveName = leaveName;
		this->leaveDays = leaveDays;
	}
	
	void setLeaveName(string leaveName){
		this->leaveName = leaveName;
	}
	
	void setLeaveDays(int leaveDays){
		this->leaveDays = leaveDays;
	}
	
	string getLeaveName() const{
		return this->leaveName;
	}
	
	int getLeaveDays() const{
		return this->leaveDays;
	}
private:
	string leaveName;
	int leaveDays;
};

抽象处理者Leader 

//抽象处理者Leader
class Leader{
public:
	Leader(string name){
		this->name = name;
	}
	
	void setSuccessor(weak_ptr<Leader> successor){
		this->successor = successor;
	}
	
	virtual void handleRequest(const LeaveRequest &request) = 0;
	
protected:
	string name;
	weak_ptr<Leader> successor;
}; 

具体处理者Director 

//具体处理者Director
class Director : public Leader{
public:
	Director(string name) : Leader(name){
		
	}
	
	void handleRequest(const LeaveRequest &request){
		//处理请求 
		if(request.getLeaveDays()<3){
			cout << "主任" << this->name << "审批员工" << request.getLeaveName() << "的请假条,请假天数为"
			 	 << request.getLeaveDays() << "天." << endl; 
		}else{
			//无法处理此请求,则交给上级处理 
			if(this->successor.lock()!=nullptr){
				this->successor.lock()->handleRequest(request);
			}
		}
	}
	
}; 

 具体处理者Manager

//具体处理者Manager
class Manager : public Leader{
public:
	Manager(string name) : Leader(name){
		
	}
	
	void handleRequest(const LeaveRequest &request){
		//处理请求 
		if(request.getLeaveDays()<10){
			cout << "经理" << this->name << "审批员工" << request.getLeaveName() << "的请假条,请假天数为"
			 	 << request.getLeaveDays() << "天." << endl; 
		}else{
			//无法处理此请求,则交给上级处理 
			if(this->successor.lock()!=nullptr){
				this->successor.lock()->handleRequest(request);
			}
		}
	}
	
}; 

具体处理者GeneralManager 

//具体处理者GeneralManager
class GeneralManager : public Leader{
public:
	GeneralManager(string name) : Leader(name){
		
	}
	
	void handleRequest(const LeaveRequest &request){
		//处理请求 
		if(request.getLeaveDays()<30){
			cout << "总经理" << this->name << "审批员工" << request.getLeaveName() << "的请假条,请假天数为"
			 	 << request.getLeaveDays() << "天." << endl; 
		}else{
			cout << "莫非" << request.getLeaveName() << "想辞职,居然请假" 
			 	 << request.getLeaveDays() << "天." << endl; 
		}
	}
	
}; 

客户端测试 

//客户端测试 
int main(void){
	shared_ptr<Leader> objDirector,objManager,objGeneralManager;
	
	//创建处理者
	objDirector = make_shared<Director>("王明");
	objManager = make_shared<Manager>("赵强");
	objGeneralManager = make_shared<GeneralManager>("李波");
	
	//设置上级
	objDirector->setSuccessor(objManager);
	objManager->setSuccessor(objGeneralManager);
	
	//职责链处理请求
	shared_ptr<LeaveRequest> lr1 = make_shared<LeaveRequest>("张三",2);
	objDirector->handleRequest(*lr1);
	
	shared_ptr<LeaveRequest> lr2 = make_shared<LeaveRequest>("李四",5);
	objDirector->handleRequest(*lr2);
	
	shared_ptr<LeaveRequest> lr3 = make_shared<LeaveRequest>("王五",15);
	objDirector->handleRequest(*lr3);
	
	shared_ptr<LeaveRequest> lr4 = make_shared<LeaveRequest>("赵六",45);
	objDirector->handleRequest(*lr4);
	
	return 0;
} 

输出结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值