Chain of Responsibilityパターンを読んだところですが、デコレータよりもその使用を好むシナリオを想像するのに苦労しています。
どう思いますか?CoRにはニッチな用途がありますか?
Chain of Responsibilityパターンを読んだところですが、デコレータよりもその使用を好むシナリオを想像するのに苦労しています。
どう思いますか?CoRにはニッチな用途がありますか?
鎖
リクエストを処理する機会を複数のオブジェクトに与えることで、リクエストの送信者と受信者を結び付けないようにします。受信オブジェクトをチェーンし、オブジェクトが処理するまでチェーンに沿ってリクエストを渡します。
対
デコレータ
オブジェクトに追加の責任を動的にアタッチします。デコレーターは、機能を拡張するためのサブクラス化に対する柔軟な代替手段を提供します。
物事が起こる順序の周りだと思います。それらをチェーンすると、チェーンに沿って が呼び出されます。デコレーターを使用すると、この順序は保証されず、追加の責任を追加できるだけです。
Chain of Responsibilityは、特定の形式のDecoratorであると言えます。
デコレーターは、オブジェクトに機能を追加する場合に使用されます。
COR は、多くのアクターの 1 つがオブジェクトに対してアクションを実行する可能性がある場合に使用されます。
タイプに基づいて、アクションを実行するために特定のデコレータが呼び出されます。一方、COR は、アクターの 1 人がアクションの完了を決定するまで、定義されたチェーンに沿ってオブジェクトを渡します。
COR は、さまざまなハンドラーへのエスカレーションに複数のレベルがある場合に使用できます。たとえば、会社に対する顧客の価値によって、電話が特定のレベルのサポートに進むかどうかが決まるコール センターなどです。
さて、私は2つの状況を考えることができます:
今はこれ以上考えられません。このトピックについてもっと知りたいです。
構造的な観点から、この 2 つのパターンは非常に似ていることに同意します。私の考えは、最終的な動作についてです。
リクエストを処理する CoR 要素の古典的な解釈では、チェーンが壊れます。
デコレータの要素がチェーンを壊すと、動作の基本部分が失われるため、デコレータの実装が間違っていることになります。そして、デコレーターの考え方は、基本的な動作が変更されていない場合に、新しい動作を透過的に追加することです。
ギャング・オブ・フォーの定義を読んだ後、私は本当の違いがあると確信していません. (便宜上含まれています)
ウィキペディアはそれらを少し肉付けしていますが、その一部はちょっと恣意的です.
最初の 2 つの属性は、実際にはパターンを区別しません。2 番目の 2 つはそうしますが、Decorator と CoR が通常実装される方法では、これらの属性が強制されません。設計者は、チェーンを切断する Decorator や、データを処理した後にチェーンを継続する CoRLink を誰も作成しないことを望んでいます。
これらの属性を実際に実装するには、次のようなものが必要です。
強制デコレーター:
abstract class Decorated {
public Decorated delegate;
public final Object doIt(Object args) {
Object returnVal = behavior(arg);
if(delegate != null) returnVal = delegate.doit(returnVal);
return returnVal;
}
protected abstract Object behavior(Object args); //base or subclass behavior
}
強制された一連の責任:
abstract class Link {
public Link delegate;
public final Object processIt(Obect args) {
Object returnVal = args;
if(isMyResponsibility) returnVal = processingBehavior(returnVal);
else returnVal = delegate.processIt(returnVal);
return returnVal;
}
protected abstract Boolean isMyResponsibility(Object args);
protected abstract Object processingBehavior(Object args);
}
(代わりに、他の誰かがあなたの設計を台無しにした場合に備えて、自分の責任を免除することだけが必要な場合は、javadoc に行を追加することもできますが、なぜそれを偶然に任せるのでしょうか?)
この 2 つのパターンを適用する状況は異なると思います。ちなみに、デコレータパターンの場合、デコレータはラップしたコンポーネントを知っている必要があります。そして CoR の場合、異なるインターセプターはお互いのことを何も知ることができませんでした。