您的位置:首页 > 其它

设计模式之责任链模式

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

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

(1)if else if ....

#include<iostream>
using namespace std;
class Handler{  ///处理类抽象
public:
Handler(int _value):value(_value){} ///设置自身能够处理的编号
virtual ~Handler(){}
void setNextHandler(Handler *_nextHandler){ ///设置后继处理者
this->nextHandler=_nextHandler;
}
virtual void putHandlerMesg(int _value)=0;  ///处理者实现进行具体的处理过程

int value;
Handler *nextHandler;
};

class A:public Handler{ ///处理类A
public:
A(int _value):Handler(_value){};
~A(){};
void putHandlerMesg(int _value){
cout<<"A handler this command:"<<_value<<endl;
}
};

class B:public Handler{ ///处理类A
public:
B(int _value):Handler(_value){};
~B(){};
void putHandlerMesg(int _value){
cout<<"B handler this command:"<<_value<<endl;
}
};

class D:public Handler{ ///默认处理类D,位于链尾部,当其他处理者不能处理时使用
public:
D(int _value):Handler(_value){};
void putHandlerMesg(int _value){
cout<<"default handler:"<<_value<<endl;
}
~D(){};
};

int MainHandle(int handlerValue,Handler *a){    ///Main函数进行处理建立的责任链
Handler *tmp=a;
while(1){
if(tmp->value == handlerValue){
tmp->putHandlerMesg(handlerValue);
break;
}
else if(tmp->value == 0)
{
tmp->putHandlerMesg(handlerValue);
break;
}
else{
tmp=tmp->nextHandler;
}
}
}

int main(){
///建立处理链,a(1)->b(2)->d(0,default)
Handler *a=new A(1);
Handler *b=new B(2);
Handler *d=new D(0);
a->setNextHandler(b);
b->setNextHandler(d);

///处理的两个例子
MainHandle(2,a);
MainHandle(4,a);
delete(a);
delete(b);
delete(d);
}


View Code
4.责任链模式的优缺点

4.1责任链模式的优点

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

4.2责任链模式的缺点

  每次都是从链头开始:这也正是链表的缺点。你也许会想到一种貌似不错的解决方案,比如使用hash映射,将要处理的请求id与处理类对象关联,但是这样系统损失了可扩展性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: