十分钟学会一个设计模式---行为模式---责任链模式

86 阅读1分钟

一、介绍

一个请求可能有多个接收者,但最后真正的处理者只有一个

二、未使用模式

// 三个处理类,根据条件判断使用哪个处理类
class Handle1 {
public:
    int handle() {
        return 80;
    }
};
class Handle2 {
public:
    int handle() {
        return 90;
    }
};
class Handle3 {
public:
    int handle() {
        return 95;
    }
};
int main() {
    Handle1 *handle1 = new Handle1;
    Handle2 *handle2 = new Handle2;
    Handle3 *handle3 = new Handle3;

    int first = handle1->handle();
    // 如果处理类较多,该处会有很多if else,  并且调整时改动不方便
    if (first >= 80) {
        int second = handle2->handle();
        if (second > 90) {
            handle3->handle();
        }
    }
}

三、使用该模式

class BaseHandle {
protected:
    BaseHandle *nextHandle;
public:
    void SetHandle(BaseHandle *baseHandle) {
        nextHandle = baseHandle;
    }

    virtual int handle() = 0;
};

class Handle1 : public BaseHandle {
public:
    int score{80};
    int handle() override {
        if (score >= 80) {
            if (this->nextHandle != nullptr) {
                return this->nextHandle->handle();
            }
            return score;
        }
    }
};

class Handle2 : public BaseHandle {
public:
    int score{90};
    int handle() override {
        if (score >= 90) {
            if (this->nextHandle != nullptr) {
                return this->nextHandle->handle();
            }
            return score;
        }
    }
};
class Handle3 : public BaseHandle {
public:
    int score{95};
    int handle() override {
        if (score >= 95) {
            if (this->nextHandle != nullptr) {
                return this->nextHandle->handle();
            }
            return score;
        }
    }
};

int main() {
    Handle1 *handle1 = new Handle1;
    Handle2 *handle2 = new Handle2;
    Handle3 *handle3 = new Handle3;

    // handle1处理后是handle2
    handle1->SetHandle(handle2);
    handle2->SetHandle(handle3);

    cout << handle1->handle();
}