一、UML图
二、包含的角色
Handler类,声明了所有具体处理者的通用接口。 该接口通常仅包含单个方法用于请求处理, 但有时其还会包含一个设置链上下个处理者的方法。
BaseHandler类,通常情况下, 该类中定义了一个保存对于下个处理者引用的成员变量。 客户端可通过将处理者传递给上个处理者的构造函数或设定方法来创建链。 该类还可以实现默认的处理行为: 确定下个处理者存在后再将请求传递给它。
ConcreteHandler类,
包含处理请求的实际代码。 每个处理者接收到请求后, 都必须决定是否进行处理, 以及是否沿着链传递请求。
处理者通常是独立且不可变的, 需要通过构造函数一次性地获得所有必要地数据。
三、特点
声明了所有具体处理者的通用接口。 该接口通常仅包含单个方法用于请求处理, 但有时其还会包含一个设置链上下个处理者的方法。
该模式能将多个处理者连接成一条链。 接收到请求后, 它会 “询问” 每个处理者是否能够对其进行处理。 这样所有处理者都有机会来处理请求
无论你以何种顺序将处理者连接成一条链, 所有请求都会严格按照顺序通过链上的处理者。
四、代码实现
Handler类
#pragma once
class Handler
{
public:
virtual void SetNext(Handler *next_handler) = 0;
virtual void Handle(int request) = 0;
};
BaseHandler类
#pragma once
#include "Handler.h"
#include <iostream>
class BaseHandler : public Handler
{
public:
virtual void SetNext(Handler *next_handler) override
{
next_handler_ = next_handler;
}
virtual void Handle(int request) override
{
if (next_handler_ != nullptr)
{
next_handler_->Handle(request);
}
else
{
printf("BaseHandler handle \n");
}
}
private:
Handler *next_handler_;
};
ConcreteHandler类,下面只实现一个。其他雷同。
#pragma once
#include "BaseHandler.h"
#include <iostream>
class ConcreteHandler1 : public BaseHandler
{
public:
using BaseHandler::BaseHandler;
virtual void Handle(int request) override
{
if (request == 1)
{
printf("concrete handler %d handle ! \n",request);
return;
}
BaseHandler::Handle(request);
}
};
main
#include "ConcreteHandler1.h"
#include "ConcreteHandler2.h"
#include "ConcreteHandler3.h"
int main() {
Handler *h1 = new ConcreteHandler1();
Handler *h2 = new ConcreteHandler2();
Handler *h3 = new ConcreteHandler3();
Handler *h4 = new BaseHandler();
h1->SetNext(h2);
h2->SetNext(h3);
h3->SetNext(h4);
std::cout << "-------request 1------";
h1->Handle(1);
std::cout << "-------request 2------";
h1->Handle(2);
delete h1;
delete h2;
delete h3;
delete h4;
return 0;
}