您的位置:首页 > 其它

【设计模式】职责链

2011-03-28 15:09 288 查看
设计模式听起来挺神秘,看例子和实现又很简单,用起来却灵活多变,总叫人觉得没学到真正灵魂的东西。

从今天起,一个一个模式的记录一下我自己的理解。

因为时间问题,这部分可能会延续比较长的时间了。

职责链

顾名思义就是一个链表(实际上跟链表有本质区别)。职责链是为了解决请求和多个响应者之间的耦合。

先看一下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),但是插入和删除指定节点的复杂度是常数级。

  让我们来着重看这第二点:

  我们来想想在文章开始时我们画出的那个链,一个链,我们可以从头将他拿起,也可以从中间将他拿起:



也就是说我们用户可以去访问节点中的任何一个节点作为开始节点,这就是链表与职责链不同的地方。

表驱动改进等后面再看看

东拼西凑的,不完全原创,凑合看吧^_^

本身还是比较简单的,主要还是看怎么灵活应用了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: