【设计模式】职责链

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

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

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

 

职责链

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

 

先看一下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;
}


职责链和链表的区别:

他们区别在哪里:

  让我们看一个链表的典型结构:

重温设计模式(三)——职责链模式(chain of responsibility)

  让我们来看一下链表的典型特征:

  1. 链表是一个链状结构,每个节点有一个next属性去指向他的下一节点。

  2. 链表有一个Header节点,然后用户每次必须通过头节点,然后去遍历寻找每一个节点。

  3. 链表遍历操作的复杂度是O(n),但是插入和删除指定节点的复杂度是常数级。

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

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

重温设计模式(三)——职责链模式(chain of responsibility)

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

 

表驱动改进等后面再看看

 

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

 

本身还是比较简单的,主要还是看怎么灵活应用了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值