当前位置: 首页 > news >正文

C++责任链模式请求处理

C++责任链模式请求处理

责任链模式将请求沿着处理器链传递,直到某个处理器处理它。这种模式解耦了请求发送者和接收者,适合日志记录、权限验证和事件过滤。

责任链包含处理器接口和具体处理器实现。

#include
#include
#include
#include

class Request {
std::string type_;
std::string content_;
int priority_;
public:
Request(const std::string& type, const std::string& content, int priority = 0)
: type_(type), content_(content), priority_(priority) {}

const std::string& type() const { return type_; }
const std::string& content() const { return content_; }
int priority() const { return priority_; }
};

class Handler {
protected:
std::unique_ptr next_;

public:
virtual ~Handler() = default;

Handler* set_next(std::unique_ptr handler) {
next_ = std::move(handler);
return this;
}

virtual void handle(const Request& request) {
if (next_) {
next_->handle(request);
}
}

virtual bool can_handle(const Request& request) const = 0;
};

class LogHandler : public Handler {
public:
bool can_handle(const Request& request) const override {
return request.type() == "LOG";
}

void handle(const Request& request) override {
if (can_handle(request)) {
std::cout << "[LOG] " << request.content() << "\n";
} else {
Handler::handle(request);
}
}
};

class AuthHandler : public Handler {
public:
bool can_handle(const Request& request) const override {
return request.type() == "AUTH";
}

void handle(const Request& request) override {
if (can_handle(request)) {
std::cout << "[AUTH] Validating: " << request.content() << "\n";
if (request.content().find("token=") != std::string::npos) {
std::cout << "[AUTH] Access granted\n";
} else {
std::cout << "[AUTH] Access denied\n";
}
} else {
Handler::handle(request);
}
}
};

class DataHandler : public Handler {
public:
bool can_handle(const Request& request) const override {
return request.type() == "DATA";
}

void handle(const Request& request) override {
if (can_handle(request)) {
std::cout << "[DATA] Processing: " << request.content() << "\n";
std::cout << "[DATA] Priority: " << request.priority() << "\n";
} else {
Handler::handle(request);
}
}
};

void chain_demo() {
auto chain = std::make_unique();
chain->set_next(std::make_unique())
->set_next(std::make_unique());

Request r1("LOG", "System startup");
Request r2("AUTH", "token=abc123");
Request r3("DATA", "Important payload", 5);
Request r4("UNKNOWN", "Test request");

chain->handle(r1);
chain->handle(r2);
chain->handle(r3);
chain->handle(r4);
}

通用责任链使用std::function。

class Filter {
std::function predicate_;
std::function action_;
std::unique_ptr next_;
public:
Filter(std::function pred,
std::function action)
: predicate_(std::move(pred)), action_(std::move(action)) {}

Filter* set_next(std::unique_ptr next) {
next_ = std::move(next);
return this;
}

void process(const std::string& data) {
if (predicate_(data)) {
action_(data);
} else if (next_) {
next_->process(data);
} else {
std::cout << "No handler for: " << data << "\n";
}
}
};

void functional_chain_demo() {
auto chain = std::make_unique(
[](const std::string& s) { return s.find("ERROR") != std::string::npos; },
[](const std::string& s) { std::cout << "Error handler: " << s << "\n"; }
);

chain->set_next(std::make_unique(
[](const std::string& s) { return s.find("WARN") != std::string::npos; },
[](const std::string& s) { std::cout << "Warning handler: " << s << "\n"; }
))->set_next(std::make_unique(
[](const std::string& s) { return s.find("INFO") != std::string::npos; },
[](const std::string& s) { std::cout << "Info handler: " << s << "\n"; }
));

chain->process("ERROR: Connection failed");
chain->process("WARN: Low memory");
chain->process("INFO: User logged in");
chain->process("DEBUG: Variable value");
}

责任链模式适合处理多层次、可动态配置的请求处理场景。

http://www.jsqmd.com/news/1049307/

相关文章:

  • 矿山皮带缺陷检测的数据增强物理建模方法
  • 安而美 AI 营销引擎新手部署与实操指南
  • 2026石家庄黄金回收口碑沉淀榜:六家经营超八年且负面评价率最低的门店 - 商业信息快查
  • 2026在无锡旧首饰承载回忆却不再佩戴,不如变现,把预算留给当下想要的生活 - 讯息早知道
  • 2026在西安闲置首饰变现渠道|实体门店资质齐全,全程保密交易,确认价格秒转账 - 讯息早知道
  • 2026 安庆|中考二三百分想学护理 3+2 专业,2026 官方简章发布,咨询号码多少 - 我叫小周
  • 2026年6月长沙全屋定制解析:鲁丽家居成为长沙性价比标杆 - 速递信息
  • 扬州翻译盖章2026最新办理流程 - 速递信息
  • 2026西安钻石回收榜首|行业翘楚领跑者,高价透明变现优选 - 讯息早知道
  • 道路运输证(企业)丢失怎么登报?2026最新完整办理流程 - 速递信息
  • 5分钟上手终极游戏存档编辑器:免费可视化修改工具快速入门指南
  • 豆包深度思考模型:多步推理与可验证链路的技术解析
  • 硬核实测|芝柏官方售后服务中心全网公告:最新中国区60+网点地址升级、售后热线同步启用 - 亨得利中国服务中心
  • 2026年芝柏官方售后服务体系权威发布:全国60+门店地址、联系电话更新升级 - 亨得利中国服务中心
  • 安全生产许可证丢失怎么登报?2026最新办理流程 - 速递信息
  • 别被高价噱头误导!福州高奢包包回收防压价指南,附正规门店地址 - 讯息早知道
  • 长寿区澳洲留学培训哪家强?收费透明保障全程留学服务 - 松梢月冷
  • AutoClaw:面向网络运维的本地化AI智能体实战指南
  • 20260609
  • 市级报纸登报怎么线上办理?合规登报完整步骤 - 速递信息
  • 收款专用票据丢失怎么登报?正规办理渠道与流程 - 速递信息
  • 发票领购簿丢失怎么登报?登报完整办理流程 - 速递信息
  • 号易号卡分销:用邀请码08888一步到位,直签一级代理,开启高佣副业 - 号易邀请码08888
  • MapCutter 3.0.2 离线地图瓦片生成器:支持百度/高德/腾讯等22级XYZ/TMS切片导出
  • 海运提单丢了登报怎么线上办理?正规办理渠道与流程 - 速递信息
  • 嵌入式GUI字体技术:从位图到TrueType的选型与emWin实战
  • 河源二手车怎么选?避坑全攻略+靠谱车行实测推荐 - 速递信息
  • 最后一次大作业:西游记相关的jieba分词,出现次数最高的20个
  • DeepSeek-V4原生稀疏注意力:CSA/HCA内核与TileLang实现解析
  • 2026年深圳家装白皮书:五家装修公司实力排名及避坑指南 - 速递信息