定义
职责链模式是一种对象行为型模式,它常用于处理具有多个处理者的请求。在一个软件系统中,当一个请求可以被多个对象处理时,这些对象可以组织成一条链,并按照这个链传递请求,从而实现了请求发送者和请求处理者之间的解耦。
职责链模式的主要角色包括:
通过使用职责链模式,可以降低对象之间的耦合度,使得一个对象无需知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息。同时,增强了系统的可扩展性,可以根据需要增加新的请求处理类,满足开闭原则。此外,职责链模式还可以实现责任分担。
实现举例
#include <iostream>
#include <list>
class Handler {
public:
virtual void handleRequest() = 0;
virtual Handler* getSuccessor() = 0;
};
class ConcreteHandler1 : public Handler {
public:
void handleRequest() override {
if (requestType == "request1") {
// 处理类型为"request1"的请求
std::cout << "ConcreteHandler1 handles request1" << std::endl;
} else {
// 将请求传递给下一个处理者
if (successor != nullptr) {
successor->handleRequest();
} else {
std::cout << "No successor to handle request" << std::endl;
}
}
}
Handler* getSuccessor() override {
return successor;
}
private:
std::string requestType; // 请求类型,这里只是一个示例,具体实现中可能需要更复杂的数据结构或参数来标识请求类型和数据等。
Handler* successor; // 下一个处理者的指针,默认为nullptr。
};
class ConcreteHandler2 : public Handler {
public:
void handleRequest() override {
if (requestType == "request2") {
// 处理类型为"request2"的请求
std::cout << "ConcreteHandler2 handles request2" << std::endl;
} else {
// 将请求传递给下一个处理者(默认为ConcreteHandler1)
if (successor != nullptr) {
successor->handleRequest();
} else {
std::cout << "No successor to handle request" << std::endl;
}
}
}
Handler* getSuccessor() override {
return successor;
}
private:
std::string requestType; // 请求类型,这里只是一个示例,具体实现中可能需要更复杂的数据结构或参数来标识请求类型和数据等。
Handler* successor; // 下一个处理者的指针,默认为nullptr。
};
int main() {
ConcreteHandler1 handler1; // 创建处理者对象,作为链头的处理者。
ConcreteHandler2 handler2; // 创建处理者对象,作为链尾的处理者。
handler1.successor = &handler2; // 将handler2设置为handler1的后继者。
handler2.successor = nullptr; // handler2没有后继者,链在此结束。
std::list<Handler*> handlers; // 创建一个处理者链表,用于存储处理者对象。
handlers.push_back(&handler1); // 将handler1添加到链表末尾。
return 0;
}
总结
职责链模式的主要特性包括:
原文地址:https://blog.csdn.net/scy518/article/details/134702846
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_35624.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。