设计模式是前人、大牛等在实际编程中对遇到的问题解决方案的抽象。
描述:将多个对象连成一条链,并沿着这条链传递请求,直到有对象处理它。
应用:程序运行时抛出异常,该异常会一直向上抛出直到遇到处理它的代码为止。
1.责任链模式在编程中的小体现,看下面的情况
switch (a)
{
case 1:
//...
break;
case 2:
//...
break;
case 3:
//...
break;
default:
break;
}
2.责任链模式的定义
责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。
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 }
责任链模式的优缺点:
优点:
实现了请求者与处理者代码分离:发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。提高系统的灵活性和可扩展行
缺点:
每次都是从链头开始:这也正是链表的缺点。你也许会想到一种貌似不错的解决方案,比如使用hash映射,将要处理的请求id与处理类对象关联,但是这样系统损失了可扩展性。