设计模式听起来挺神秘,看例子和实现又很简单,用起来却灵活多变,总叫人觉得没学到真正灵魂的东西。
从今天起,一个一个模式的记录一下我自己的理解。
因为时间问题,这部分可能会延续比较长的时间了。
职责链:
顾名思义就是一个链表(实际上跟链表有本质区别)。职责链是为了解决请求和多个响应者之间的耦合。
先看一下UML描述吧:
当前处理者,如果能够处理该请求,则处理之,否则将该请求转给后继者。依次遍历所有链对象。
看一下demo代码,还是比较简单的:
#@author itegel
#include <iostream>
using namespace std;
class Request{
public:
Request(int type){
_type = type;
}
int _type;
};
class RequestHandler{
public:
RequestHandler(int req_type, RequestHandler * successor):_req_type(req_type), _successor(successor){}
~RequestHandler(){}
virtual bool Handle(Request * req) = 0;
protected:
int _req_type;
RequestHandler * _successor;
};
class Handler1 : public RequestHandler{
public:
Handler1(int req_type, RequestHandler * successor):RequestHandler(req_type, successor){}
virtual bool Handle(Request * req){
if (req->_type == _req_type){
cout<<"Handler1, handled it!"<<endl;
return true;
} else if (_successor){
cout<<"Handler1, cannot handle it, pass it to sucessor!"<<endl;
return _successor->Handle(req);
} else {
cout<<"Handler1, reach end of chain, no matching handler!"<<endl;
return false;
}
}
};
class Handler2 : public RequestHandler{
public:
Handler2(int req_type, RequestHandler * successor):RequestHandler(req_type, successor){}
virtual bool Handle(Request * req){
if (req->_type == _req_type){
cout<<"Handler2, handled it!"<<endl;
return true;
} else if (_successor){
cout<<"Handler2, cannot handle it, pass it to sucessor!"<<endl;
return _successor->Handle(req);
} else {
cout<<"Handler2, reach end of chain, no matching handler!"<<endl;
return false;
}
}
};
int main(){
Handler1 * handler1 = new Handler1(1, NULL);
Handler2 * handler2 = new Handler2(2, handler1);
RequestHandler * handler_head = handler2;
Request * req1 = new Request(1);
Request * req2 = new Request(2);
Request * req3 = new Request(3);
cout<<"req1:"<<endl;
handler_head->Handle(req1);
cout<<"req2:"<<endl;
handler_head->Handle(req2);
cout<<"req3:"<<endl;
handler_head->Handle(req3);
return 0;
}
职责链和链表的区别:
他们区别在哪里:
让我们看一个链表的典型结构:
让我们来看一下链表的典型特征:
1. 链表是一个链状结构,每个节点有一个next属性去指向他的下一节点。
2. 链表有一个Header节点,然后用户每次必须通过头节点,然后去遍历寻找每一个节点。
3. 链表遍历操作的复杂度是O(n),但是插入和删除指定节点的复杂度是常数级。
让我们来着重看这第二点:
我们来想想在文章开始时我们画出的那个链,一个链,我们可以从头将他拿起,也可以从中间将他拿起:
也就是说我们用户可以去访问节点中的任何一个节点作为开始节点,这就是链表与职责链不同的地方。
表驱动改进等后面再看看
东拼西凑的,不完全原创,凑合看吧^_^
本身还是比较简单的,主要还是看怎么灵活应用了。