zoukankan      html  css  js  c++  java
  • 设计模式之责任链模式

    设计模式是前人、大牛等在实际编程中对遇到的问题解决方案的抽象,也就是每一个设计模式都在编程实例中有体现。

    1.责任链模式在编程中的小体现,看下面的情况:

    (1)if else if ....

     1 if(a<12){
     2     ...
     3 }
     4 else if (a<25){
     5     ...
     6 }
     7 else if(a<67){
     8     ...
     9 }
    10 else{
    11     ...
    12 }
    View Code

    (2)switch case

    1 switch(a)
    2 {
    3     case 1:     ;break;
    4     case 2:     ;break;
    5     case 3:     ;break;
    6     default:    
    7 }
    View Code

    (3)链表next

    1 typedef struct node
    2 {
    3     int value;
    4     struct node *next;
    5 }TreeNode;
    View Code

     上面的三种情况中,共同特点就是必须依次扫描每个分支进行判断,找到对应的分支进行处理。(C++、Java中switch也是要遍历每个分支的)

    2.责任链模式的定义

      责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。

      责任链模式的重点在“链”上,有一条链去处理相似的请求在链中决定由谁去处理这个请求,并返回相应的结果。

      在1中的3个例子中,第一个if、switch、Tree root节点就相当于“链的入口”,当每个分支都要进行复杂的业务逻辑处理时,使用责任链模式比较好。

    3.责任链模式简单实例

      设计模式是不分语言的。虽然Java提供特有机制对应的关键字,如clone(原型模式)、Observable(观察者模式)等。但是其他语言也可以实现这些,只可能是机制不同而已。

     责任链模式C++实例代码:

    (1)Handler类是其他具体处理类A、B、D类的父类,提供抽象,公共代码。

    (2)代码建立责任链A->B->D。(责任链末尾必须是默认处理类,也即switch中的default部分)

     1 #include<iostream>
     2 using namespace std;
     3 class Handler{  ///处理类抽象
     4 public:
     5     Handler(int _value):value(_value){} ///设置自身能够处理的编号
     6     virtual ~Handler(){}
     7     void setNextHandler(Handler *_nextHandler){ ///设置后继处理者
     8         this->nextHandler=_nextHandler;
     9     }
    10     virtual void putHandlerMesg(int _value)=0;  ///处理者实现进行具体的处理过程
    11 
    12     int value;
    13     Handler *nextHandler;
    14 };
    15 
    16 class A:public Handler{ ///处理类A
    17 public:
    18     A(int _value):Handler(_value){};
    19     ~A(){};
    20     void putHandlerMesg(int _value){
    21         cout<<"A handler this command:"<<_value<<endl;
    22     }
    23 };
    24 
    25 class B:public Handler{ ///处理类A
    26 public:
    27     B(int _value):Handler(_value){};
    28     ~B(){};
    29     void putHandlerMesg(int _value){
    30         cout<<"B handler this command:"<<_value<<endl;
    31     }
    32 };
    33 
    34 class D:public Handler{ ///默认处理类D,位于链尾部,当其他处理者不能处理时使用
    35 public:
    36     D(int _value):Handler(_value){};
    37     void putHandlerMesg(int _value){
    38         cout<<"default handler:"<<_value<<endl;
    39     }
    40     ~D(){};
    41 };
    42 
    43 int MainHandle(int handlerValue,Handler *a){    ///Main函数进行处理建立的责任链
    44     Handler *tmp=a;
    45     while(1){
    46         if(tmp->value == handlerValue){
    47             tmp->putHandlerMesg(handlerValue);
    48             break;
    49         }
    50         else if(tmp->value == 0)
    51         {
    52             tmp->putHandlerMesg(handlerValue);
    53             break;
    54         }
    55         else{
    56             tmp=tmp->nextHandler;
    57         }
    58     }
    59 }
    60 
    61 int main(){
    62     ///建立处理链,a(1)->b(2)->d(0,default)
    63     Handler *a=new A(1);
    64     Handler *b=new B(2);
    65     Handler *d=new D(0);
    66     a->setNextHandler(b);
    67     b->setNextHandler(d);
    68 
    69     ///处理的两个例子
    70     MainHandle(2,a);
    71     MainHandle(4,a);
    72     delete(a);
    73     delete(b);
    74     delete(d);
    75 }
    View Code

     4.责任链模式的优缺点

    4.1责任链模式的优点

      实现了请求者与处理者代码分离:发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。提高系统的灵活性和可扩展行。

    4.2责任链模式的缺点

      每次都是从链头开始:这也正是链表的缺点。你也许会想到一种貌似不错的解决方案,比如使用hash映射,将要处理的请求id与处理类对象关联,但是这样系统损失了可扩展性。

  • 相关阅读:
    HDU-6534-Chika and Friendly Pairs (莫队算法,树状数组,离散化)
    SPOJ-DQUERY-D-query
    视频上云/网络穿透/拉转推工具EasyNTS设备IP地址返回数据与实际IP匹配的筛选机制优化
    视频上云/网络穿透/拉转推工具EasyNTS新增获取windows所有盘符信息功能的实现
    【解决方案】热门景区实现智慧旅游,城市道路/风景区视频公众号分享该如何实现?
    TSINGSEE青犀视频开发webrtc使用ffmpeg编译报ffmpeg version: N-94448-G3CEA9CD219提示是什么原因
    TSINGSEE青犀视频开发webrtc浏览器使用video标签播放webrtc本地录音音频实现过程
    【解决方案】智慧农业自动化的浪潮下,大棚实时视频监控系统应该如何搭建?
    【解决方案】房地产行业施工现场搭建视频4G无线远程视频监管信息化行业应用方案建议书
    【解决方案】国标GB28181协议视频智能分析平台EasyCVR搭建智慧养殖平台,让畜牧业实现“万物互联”
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/3617860.html
Copyright © 2011-2022 走看看