<aside> 💡

职责链模式(Chain of Responsibility)

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理该请求为止

</aside>

结构图

image.png

优缺点

优点

缺点

题目

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;
}