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

15-责任链(Chain of Responsibility)模式Ruby实现

责任链模式(Chain of Responsibility)