Chain of Responsibility(责任链)
Posted 46cxf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Chain of Responsibility(责任链)相关的知识,希望对你有一定的参考价值。
15. Chain of Responsibility(责任链)
15.1 定义
使多个对象都有机会处理请求,从而避免了请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。
15.2 优点
■ 责任链模式将请求和处理分开,请求者不知道是谁处理的,处理者可以不用知道请求的全貌。
■ 提高系统的灵活性。
15.3 缺点
■ 降低程序的性能,每个请求都是从链头遍历到链尾,当链比较长的时候,性能会大幅下降。
■ 不易于调试,由于采用了类似递归的方式,调试的时候逻辑比较复杂。注意责任链中的节点数量需要控制,避免出现超长链的情况,这就需要设置一个最大的节点数量,超过则不允许增加节点,避免无意识地破坏系统性能。
15.3. 应用场景
■ 一个请求需要一系列的处理工作。
■ 业务流的处理,例如,文件审批。
■ 对系统进行补充扩展。
15.4 c++源码例程
1 #include<iostream> 2 using namespace std; 3 class Player{ 4 private: 5 Player* successor = NULL; 6 public: 7 virtual void handle(int i) = 0; 8 void setSuccessor(Player* Successor){ 9 this->successor = Successor; 10 } 11 void next(int index){ 12 if(successor != NULL){ 13 successor->handle(index); 14 }else{ 15 cout<<"游戏结束"<<endl; 16 } 17 } 18 }; 19 class PlayerA:public Player{ 20 public: 21 PlayerA(Player* successor){ 22 this->setSuccessor(successor); 23 } 24 void handle(int i){ 25 if(i==1){ 26 cout<<"PlayerA 喝酒"<<endl; 27 }else{ 28 cout<<"PlayerA 向下传"<<endl; 29 next(i); 30 } 31 } 32 }; 33 class PlayerB:public Player{ 34 public: 35 PlayerB(Player* successor){ 36 this->setSuccessor(successor); 37 } 38 void handle(int i){ 39 if(i==2){ 40 cout<<"PlayerB 喝酒"<<endl; 41 }else{ 42 cout<<"PlayerB 向下传"<<endl; 43 next(i); 44 } 45 } 46 }; 47 48 49 int main(){ 50 Player* play = new PlayerA(new PlayerB(NULL)); 51 play->handle(2); 52 delete play; 53 play = NULL; 54 }
以上是关于Chain of Responsibility(责任链)的主要内容,如果未能解决你的问题,请参考以下文章
20 关卡设计-责任链(Chain of Responsibility)
职责链模式- Chain of Responsibility
设计模式入门之职责链模式Chain Of Responsibility
B5:责任链模式 Chain Of Responsibility