C ++行動パターン - 責任の連鎖(責任のチェーン)

1)意図

また、これまでオブジェクトハンドルまで鎖に沿って要求を渡すチェーンに一緒に複数のオブジェクト、。

2)構造

 

 

 どこで:

  1. ハンドラは、要求を処理するインタフェースを定義します
  2. ConcreteHandlerのそれは責任がある処理要求
  3. クライアントは、特定の処理チェーンに要求を提出します

 

3)適用

  1. オブジェクトの複数の実行時間を決定し、自動的にリクエストを処理するために、オブジェクト要求を処理することができ
  2. 私は明示的に指定した受信者なしで複数のオブジェクトに要求を提出したいと思います
  3. リクエストを処理して、動的に割り当てられるオブジェクトの集合であってもよいです

4)実施例

1の#include <iostreamの>
 2の#include <list>の
 3  クラス  ハンドラ
 4  {
 5  公共6      ハンドラ(ハンドラ* 後継):m_successor(後継){}
 7      仮想ハンドラ() 
 8      {
 9          なら(m_successor)
 10          {
 11              削除m_successor;
12              m_successor = NULL;
13          }
 14      }
 15      仮想 ボイド   のhandleRequest(INT NUM)=0 ;
16  保護17      ハンドラ* m_successor。
18  }。
19  クラス   ConcreateHandler1:公共ハンドラ
 20  {
 21  公共22      ConcreateHandler1(ハンドラ* 後継):ハンドラ(後継){}
 23      仮想ConcreateHandler1(){}
 24      仮想 ボイド   のhandleRequest(INT NUM)
 25      {
 26          であれば(NUM == 1 27          {
 28             std :: coutの<< " ConcreateHandler1のhandleRequest " << はstd ::てendl;
29          }
 30          そう であれば(m_successor!= NULL)
 31          {
 32              m_successor-> のhandleRequest(NUM)。
33          }
 34          他の
35          {
 36              のstd :: COUT << " エラーConcreateHandler1 m_successorヌル" << はstd :: ENDL。
37  
38          }
 39      }
 40  }。
41  クラス  ConcreateHandler2:公共ハンドラ
 42  {
 43  公共44      ConcreateHandler2(ハンドラ* 後継):ハンドラ(後継){}
 45      仮想ConcreateHandler2(){}
 46      仮想 ボイド   のhandleRequest(INT NUM)
 47      {
 48          であれば(NUM == 2 49          {
 50              のstd :: COUT << " ConcreateHandler2のhandleRequest " << はstd :: ENDL。
51          }
 52           もし(!m_successor = NULL)
 53          {
 54              m_successor-> のhandleRequest(NUM)。
55          }
 56          他の
57          {
 58              のstd :: COUT << " エラーConcreateHandler1 m_successorヌル" << はstd :: ENDL。
59  
60          }
 61      }
 62  }。
63  
64   のint main()の
 65  {
 66       ハンドラ* PTR1 = 新しいConcreateHandler1(NULL)。
67       ハンドラ* PTR2 = 新しいですConcreateHandler2(PTR1)。
68       ptr2->のhandleRequest(1 )。
69       ptr2->のhandleRequest(2 )。
70       ptr2->のhandleRequest(0 )。
71の 
72       削除PTR2。
73       システム(一時停止)。
74   }

 

おすすめ

転載: www.cnblogs.com/ho966/p/12233442.html