序文
今日は[]責任柄の責任パターンチェーンのチェーンをご紹介します。Chain of Responsibilityパターンについて、それを理解することは比較的容易です。例えば、会社ではなく、3日〜7日は、取締役の承認が必要になる場合がありますすることができ、3日以内に承認のための部門のマネージャーを残す、副社長以上七日の承認を必要とします。このようなソリューションのための初期需要があれば-else文を判断することです。しかし、あなたは開閉の原則に違反する場合は、他の複数を、修正する必要性を追加するためのモードを離れると。Chain of Responsibilityパターン上のこの時間は、彼らの問題を解決するために使用することができます。受信者オブジェクトのチェーンを作成するための要求のためのChain of Responsibilityパターン。このタイプのモデルは、要求送信者と受信者のデカップリングに、要求を与えられました。
責任パターンプレゼンテーションのチェーン
まず、その理由
ソフトウェアシステムでは、多くの場合、複数のリクエストを処理することができるオブジェクトがあります。しかし、すべての時間は、オブジェクトが処理されます。これは、一つのオブジェクトを決定することはできません。ディスプレイは、各オブジェクトに指定された場合。これは、密結合によって引き起こされ、送信者と受信者を要求します。それでは、どの送信者と受信者のデカップリングの要求を行います。そして、実行時オブジェクトでそれを決定する要求を処理するには?
第二に、意図
複数のオブジェクトは、これらのオブジェクトは鎖を形成し、オブジェクトは、これまでそれを処理するまで、要求は鎖に沿って送信される接続要求を受信する可能性があるように、送信側と受信側は、互いに結合されている要求避けます。
第三に、ケース
第四に、責任のパターンのコードサンプルのチェーン
上記の図の例を参照して、主に二つの部分を含みます。
インターフェイスに処理要求を定義する:によって抽象
特定のハンドラ:インタフェースの処理要求の実装では、独自のプロセスを選択するか、次の受信者に渡すことができます。次のハンドラのへの参照を受け取ります。
Chain of Responsibilityパターンの一部は非常に簡単です。当社は、ユーザーの決済金額が計算され、このような場合、または例を参照してください。ユーザーのメンバーシップレベルに基づいて対応割引決済。一般ユーザのフルコスト、95%の計算オフ通常のメンバー、計算ゴールド10%、ダイヤモンドの計算30%オフ:
私たちは、最初の責任パターン処理のチェーンを使用しない方法を見て:
名前空間のChainofResponsibility_Pattern { クラスプログラム { 静的な無効メイン(文字列[] args) { 小数マネー= 200M; VARのmemberType = MemberType.GoldMember。 //通常のメンバーは、95の割引が計算されます もし(のmemberType == MemberType.Member) { Console.WriteLineを($「計算オフ普通部材95、{マネー* 0.95M}の最終的な量」)。 } //ゴールド、10%の計算 それ以外の場合(のmemberType == MemberType.GoldMember) { Console.WriteLineを($ "ゴールド、10%が算出され、{マネー* 0.9M}の最終的な量")。 } //ダイヤモンドメンバー、計算30%オフ それ以外の場合(のmemberType == MemberType.DiamondsMember) { Console.WriteLineを($「計算オフダイヤモンドメンバー7、{マネー* 0.7M}の最終的な量」)。 } //なしのメンバー、完全な原価計算 他 { Console.WriteLineを($「NO部材、フル原価、{金}の最終的な量」)。 } } パブリック列挙型のmemberType { [説明(「非会員」)] NoMember = 1、 [説明( "メンバー")] メンバー= 2、 [説明( "ゴールド")] GoldMember = 3、 [説明( "ダイヤモンド")] DiamondsMember = 4 } } }
ここでは、我々がいる場合は、この需要(またはswitch文)の完了を判断するための条件の数を使用していることがわかります。ここでは、メンバーを追加したり、割引が条件文を修正するための直接的な方法です。または割引のメンバーは、条件を変更する必要が変更されました。ここでは、リクエスト送信者と受信者は、密結合を持っています。そして、複数の条件が加算され、判決を理解することは容易ではない場合。
私たちは、Chain of Responsibilityパターンの使用を見てみましょう:
名前空間のChainofResponsibility_Pattern { パブリック列挙型のmemberType { [説明(「非会員」)] NoMember = 1、 [説明( "メンバー")] メンバー= 2、 [説明( "ゴールド")] GoldMember = 3、 [説明( "ダイヤモンド")] DiamondsMember = 4 } クラスChainofResponsibilityPattern { } /// <要約> ///決済要求 /// </要約> パブリッククラスSettlementRequest { /// <要約> ///額 /// </要約> 公共小数点_money。 /// <要約> ///メンバーシップのタイプ /// </要約> 公共のmemberType _memberType。 公共SettlementRequest(小数点お金、のmemberTypeのmemberType) { this._money =お金。 this._memberType =のmemberType。 } } /// <要約> ///決済の抽象化 /// </要約> パブリック抽象クラスSettlementHandler { /// <要約> 下の///受信ハンドラ /// </要約> 公共SettlementHandler nextHandler。 パブリック抽象ボイド決済(SettlementRequest settlementRequest)。 } /// <要約> いいえメンバーの受け手ません/// /// </要約> パブリッククラスNoMemberHandler:SettlementHandler { 公共オーバーライドボイド決済(SettlementRequest settlementRequest) { もし(settlementRequest._memberType == MemberType.NoMember) { Console.WriteLineを($ "NO部材、計算の最終量は、{settlementRequest._money}を割り引かれていません。")。 } 他 { nextHandler.Settlement(settlementRequest)。 } } } /// <要約> ///ハンドラを受ける通常のメンバー /// </要約> パブリッククラスMemberHandler:SettlementHandler { 公共オーバーライドボイド決済(SettlementRequest settlementRequest) { もし(settlementRequest._memberType == MemberType.Member) { Console.WriteLineを($ "最終量オフ普通部材95は、{settlementRequest._moneyの*の0.9M}算出されます。"); } 他 { nextHandler.Settlement(settlementRequest)。 } } } /// <要約> 受信ハンドラ///ゴールドメンバー /// </要約> パブリッククラスGoldMemberHandler:SettlementHandler { 公共オーバーライドボイド決済(SettlementRequest settlementRequest) { もし(settlementRequest._memberType == MemberType.GoldMember) { Console.WriteLineを($ "ゴールド、最終量の10%を計算する{settlementRequest._moneyの*の0.9M}。"); } 他 { nextHandler.Settlement(settlementRequest)。 } } } /// <要約> ///ダイヤモンドメンバーが治療を受けていました /// </要約> パブリッククラスDiamondsMemberHandler:SettlementHandler { 公共オーバーライドボイド決済(SettlementRequest settlementRequest) { もし(settlementRequest._memberType == MemberType.DiamondsMember) { Console.WriteLineを($ "{settlementRequest._moneyの*の0.7M}最終的な計算ダイヤモンドメンバー7倍の量。"); } 他 { nextHandler.Settlement(settlementRequest)。 } } } }
名前空間のChainofResponsibility_Pattern { クラスプログラム { 静的な無効メイン(文字列[] args) { ///設定要求 SettlementRequest settlementRequest =新しいSettlementRequest(200、MemberType.GoldMember)。 ///固有の初期化プロセス SettlementHandler NoMember =新しいNoMemberHandler(); SettlementHandlerメンバー=新しいMemberHandler(); SettlementHandler GoldMember =新しいGoldMemberHandler(); SettlementHandler DiamondsMember =新しいDiamondsMemberHandler(); 責任の///セットチェーン NoMember.nextHandler =メンバー。 Member.nextHandler = GoldMember。 GoldMember.nextHandler = DiamondsMember。 ///処理要求 NoMember.Settlement(settlementRequest)。 } } }
ここでは、メンバーシップを決定し、異なるクラスにダウンして計算します。各クラスは唯一の彼自身の会員割引のために計算されます。我々は、メンバーシップモデルを増やすだけ再構築するための責任の特定のクラス処理とチェーンを追加する必要があります。あなたが対応する割引を変更する場合ものみ対応を変更することができ、クラスのメンバーです。我々は、次の営業成績を見て、上記と同じです。
使用シナリオと長所と短所
まず、シナリオの使用
1、自身が実行時処理で決定する特定のオブジェクトのオブジェクトを扱う同じ要求、複数の
図2は、特に受信者が理解していない場合には、複数のオブジェクトに要求を提出します
コードの場合-else文のブロックが複数、責任のパターンの再構築されたチェーンを使用することを検討してください3、
4、複数のオブジェクトのシステムの承認プロセスを完了する必要があります。例えば、残したり、購買システムモジュール。
第二に、利点
図1に示すように、送信側と受信側との間の結合度を低減する要請
図2に示すように、オブジェクトは、オブジェクトの構造を簡素化することであるが、鎖をクリアされません
3、スケーラビリティを向上させ、オブジェクト割り当てられた責任の柔軟性を高めます
図4に示すように、各クラスに特定のプロセスに分散条件文複数の、コードの可読性を高めます。コードをより明確に、より明確な責任
第三に、欠点
1は、見つけることができません受信者を要求する前に、ターゲットよりも責任の長鎖を生き残る場合、パフォーマンスに多少影響
図2に示すように、処理される要求をもたらし得ます
3、エラーのトラブルシューティングを行うことは容易ではないかもしれません
4、簡単サイクルコールにつながります
概要
Chain of Responsibilityパターンは、主に、要求送信者と受信者との間の結合を減少させます。このようなオブジェクトの複数の特定のリクエストを処理する機会います。あなたは、休暇承認システムに残すために複数の文字が必要な場合があります。人々は調達システムを承認する、異なる高さを必要とするかもしれません。要求は、複数のオブジェクトによって処理され、受信者オブジェクトが、明確ではないことができます。したがって、オブジェクトは、チェーンに接続されたので、この要求は、鎖に沿って渡されます。責任鎖で治療まで。