C++责任链模式

意图

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连城一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

适用性

  • 有多个对象可以处理以恶搞请求,哪个对象处理该请求运行时刻自动确定
  • 你想在不明确接受者的情况下,向多个对象中的一个提交一个请求
  • 可处理一个请求的对象集合应被动态指定

示意性代码

#include <iostream>

using namespace std;

// 抽象处理者:领导类
class Leader {
public:
    void setNext(Leader* next) {
        this->m_next = next;
    }

    Leader* getNext() const {
        return m_next;
    }

    virtual ~Leader() { }

    // 处理请求的方法
    virtual void handleRequest(int leaveDays) = 0;

private:
    Leader* m_next;
};

// 具体处理者1 : 班主任类
class ClassAdviser : public Leader {
public:
    void handleRequest(int LeaveDays) override {
        if (LeaveDays <= 2) {
            cout << "班主任批准您请假" << LeaveDays << "天\n";
        } else {
            if (getNext() != nullptr) {
                getNext()->handleRequest(LeaveDays);
            } else {
                cout << "请假天数太多,没有人批准该假条" << endl;
            }
        }
    }
};

// 具体处理者2: 系主任类
class DepartmentHead : public Leader {
public:
    void handleRequest(int LeaveDays) override {
        if (LeaveDays <= 7) {
            cout << "系主任批准您请假" << LeaveDays << "天\n";
        } else {
            if (getNext() != nullptr) {
                getNext()->handleRequest(LeaveDays);
            } else {
                cout << "请假天数太多,没有人批准该假条" << endl;
            }
        }
    }
};

// 具体处理者3: 院长类
class Dean : public Leader {
public:
    void handleRequest(int LeaveDays) override {
        if (LeaveDays <= 10) {
            cout << "系主任批准您请假" << LeaveDays << "天\n";
        } else {
            if (getNext() != nullptr) {
                getNext()->handleRequest(LeaveDays);
            } else {
                cout << "请假天数太多,没有人批准该假条" << endl;
            }
        }
    }
};

int main() {
    // 组装责任链
    Leader* teacher1 = new ClassAdviser();
    Leader* teacher2 = new DepartmentHead();
    Leader* teacher3 = new Dean();

    teacher1->setNext(teacher2);
    teacher2->setNext(teacher3);

    int n;
    // 提交请求
    while(cin >> n) {
        teacher1->handleRequest(n);
    }
    

    delete teacher1;
    teacher1 = nullptr;

    delete teacher2;
    teacher2 = nullptr;

    delete teacher3;
    teacher3 = nullptr;
}


参考

  1. 责任链模式(职责链模式)详解
posted @ 2022-07-26 17:06  岁月飞扬  阅读(242)  评论(0编辑  收藏  举报