10

先日、Chain Of Responsibility を調べていたところ、この例に出会いました。

基本的に、抽象ハンドラーがあり、次に具象ハンドラーがあり、それぞれが親抽象ハンドラーのハンドル メソッドを実装します。実装は、最初にこの特定のハンドラーが現在の要求を処理できるかどうかを確認するためのチェックがあり、そうでない場合は、要求を後続のハンドラーに渡すようになっています。

ここで、単純な if-else 条件付きブロックを使用して同じことを行うこともできます。上記のリンクから最初の例を取得するには、次のように変更します。

class SingleHandler
{
    if(request > 0 && request <= 10)
    {
        // Process request
    }
    else if(request > 10 && request <= 20)
    {
        // Process request differently
    }
    else if(request > 20 && request <= 30)
    {
        // Process request differently
    }
}

さて、私の質問は、この 2 つの根本的な違いは何ですか? if-else ブロックを使用してまったく同じ機能を提供できる場合、責任の連鎖を使用する必要がある特定の理由はありますか? パフォーマンス、メモリ消費、保守性、スケーラビリティに関して、どちらが優れていますか?

4

1 に答える 1

16

はい、この例を書き直して、複数の if-else-cascade を使用できます。しかし、それはかなり単純な例だからです。

責任の連鎖はダイナミックなパターンです。これは、実行時にハンドラーを交換できることを意味します。これは、いくつかのネストされたコントロールがハンドラーを表すことができる UI コードでよく行われます。次のシナリオを想像してください。

窓があります。このウィンドウには、ある種のパネルがあります。このパネルにはテキスト ボックスがあります。テキスト ボックスを右クリックします。実行されるコマンドは階層によって異なります。システムは、最初のハンドラー (テキスト ボックス) にクリック要求を処理するように依頼します。リクエストをどう処理すればよいかわからない場合は、それを親であるパネルなどに渡します。if-else-cascade を使用してこの種のシナリオを実装する必要があるとは思えません。UI を変更するたびに、カスケードを変更する必要があります。そのため、ハンドラー オブジェクトが使用されます。コードの交換と再利用が可能になります。

多くのパターンは、さまざまな方法で実装できます。これは、オブジェクト指向のない低レベルのプログラミング言語での通常の方法です。ただし、これらのコードは通常、非常に柔軟性がなく、保守が困難です。それでも、これが彼らを速くするものです。

于 2014-05-22T11:25:53.280 に答える