1)意図
また、これまでオブジェクトハンドルまで鎖に沿って要求を渡すチェーンに一緒に複数のオブジェクト、。
2)構造
どこで:
- ハンドラは、要求を処理するインタフェースを定義します
- ConcreteHandlerのそれは責任がある処理要求
- クライアントは、特定の処理チェーンに要求を提出します
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 }