一、介绍
一个请求可能有多个接收者,但最后真正的处理者只有一个
二、未使用模式
// 三个处理类,根据条件判断使用哪个处理类
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();
}