【设计模式】职责链
2011-03-28 15:09
288 查看
设计模式听起来挺神秘,看例子和实现又很简单,用起来却灵活多变,总叫人觉得没学到真正灵魂的东西。
从今天起,一个一个模式的记录一下我自己的理解。
因为时间问题,这部分可能会延续比较长的时间了。
职责链:
顾名思义就是一个链表(实际上跟链表有本质区别)。职责链是为了解决请求和多个响应者之间的耦合。
先看一下UML描述吧:
当前处理者,如果能够处理该请求,则处理之,否则将该请求转给后继者。依次遍历所有链对象。
看一下demo代码,还是比较简单的:
职责链和链表的区别:
他们区别在哪里:
让我们看一个链表的典型结构:
让我们来看一下链表的典型特征:
1. 链表是一个链状结构,每个节点有一个next属性去指向他的下一节点。
2. 链表有一个Header节点,然后用户每次必须通过头节点,然后去遍历寻找每一个节点。
3. 链表遍历操作的复杂度是O(n),但是插入和删除指定节点的复杂度是常数级。
让我们来着重看这第二点:
我们来想想在文章开始时我们画出的那个链,一个链,我们可以从头将他拿起,也可以从中间将他拿起:
也就是说我们用户可以去访问节点中的任何一个节点作为开始节点,这就是链表与职责链不同的地方。
表驱动改进等后面再看看
东拼西凑的,不完全原创,凑合看吧^_^
本身还是比较简单的,主要还是看怎么灵活应用了。
从今天起,一个一个模式的记录一下我自己的理解。
因为时间问题,这部分可能会延续比较长的时间了。
职责链:
顾名思义就是一个链表(实际上跟链表有本质区别)。职责链是为了解决请求和多个响应者之间的耦合。
先看一下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),但是插入和删除指定节点的复杂度是常数级。
让我们来着重看这第二点:
我们来想想在文章开始时我们画出的那个链,一个链,我们可以从头将他拿起,也可以从中间将他拿起:
也就是说我们用户可以去访问节点中的任何一个节点作为开始节点,这就是链表与职责链不同的地方。
表驱动改进等后面再看看
东拼西凑的,不完全原创,凑合看吧^_^
本身还是比较简单的,主要还是看怎么灵活应用了。
相关文章推荐
- 设计模式:职责链模式
- IOS设计模式的六大设计原则之单一职责原则(SRP,Single Responsibility Principle)
- 设计模式:单一职责原则
- 职责链模式-设计模式系列
- 设计模式-利用职责链模式消除if
- 设计模式之Chain ofResponsibility -职责链
- 设计模式六大原则(1):单一职责原则
- Java设计模式—— 职责链模式
- 设计模式学习之职责链模式
- 设计模式六大原则-单一职责原则、开放封闭原则、依赖倒转原则、里氏代换原则、迪米特法则、合成/聚合复用原则
- 我与C++设计模式(二十)——职责链模式
- "围观"设计模式(1)--单一职责原则(SRP,Single Responsibility Principle)
- 设计模式六大原则--1:单一职责原则
- OOP设计模式[JAVA]——03职责链模式
- 设计模式之六大原则——单一职责原则(SRP)
- 设计模式六大原则(1):单一职责原则
- 设计模式学习(简单工厂、策略模式、单一职责、开闭原则)
- 设计模式之单一职责原则
- 设计模式个人总结,单一职责原则总结
- 设计模式——单一职责原则