<aside> 💡
职责链模式(Chain of Responsibility)
使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理该请求为止
</aside>
优点
缺点
https://kamacoder.com/problempage.php?pid=1100
#include <iostream>
#include <string>
// 请求类
class Request{
private:
std::string name;
int days;
public:
Request(std::string name, int days): name(name), days(days){}
std::string getName() const {
return name;
}
int getDays() const {
return days;
}
};
// Handler类
class Handler{
protected:
// 包含一个指向下一个处理者的链接
Handler* superior = nullptr;
public:
void setSuperior(Handler* superior){
this->superior = superior;
}
virtual void requestApplication(const Request& request) = 0;
};
// ConcreteHandler类
class Supervisor: public Handler{
public:
// 处理请求的方法,如果能处理就处理,不能处理就传给下一个处理者
void requestApplication(const Request& request) override {
if(request.getDays() <= 3){
std::cout << request.getName() << " Approved by Supervisor." << std::endl;
}else{
superior->requestApplication(request);
}
}
};
class Manager: public Handler{
public:
void requestApplication(const Request& request) override {
if(request.getDays() <= 7){
std::cout << request.getName() << " Approved by Manager." << std::endl;
}else{
superior->requestApplication(request);
}
}
};
class Director: public Handler{
public:
void requestApplication(const Request& request) override {
if(request.getDays() <= 10){
std::cout << request.getName() << " Approved by Director." << std::endl;
}else{
std::cout << request.getName() << " Denied by Director." << std::endl;
}
}
};
int main(){
Handler* supervisor = new Supervisor();
Handler* manager = new Manager();
Handler* director = new Director();
// 客户端负责组装职责链
supervisor->setSuperior(manager);
manager->setSuperior(director);
int n;
std::cin >> n;
for(int i = 0; i < n; ++i){
std::string name;
int days;
std::cin >> name >> days;
Request request(name, days);
supervisor->requestApplication(request);
}
delete supervisor;
delete manager;
delete director;
return 0;
}