私はかなりの時間デザインパターンを使用していて、それを "Chain-of-Responsibility pattern"と呼んでいますが、今は違いがあることを認識しており、そうするのは適切ではないかもしれません。ですから、私の質問は1です、 "次はこのパターンのインスタンスですか、それとも別のものと呼ばれるべきですか?"、2、 "伝統的な方法を好む理由がありますか?"これは依然として一連の責任パターンと考えられますか?
私はソフトウェアを開発する際に次のパターンを使用することがよくあります。私はfunctorを定義するインタフェースを持っています。
interface FooBar{
boolean isFooBar(Object o);
}
これらは通常検索、フィルタリング、または処理クラスです。通常Comparatorのようなものです。実装方法は通常機能的(すなわち、副作用なし)である。結局、私は自分自身がどのように見えるインタフェースの実装を作成見つける:
class FooBarChain implements FooBar{
FooBar[] foobars;
FooBarChain(FooBar... fubars){
foobars = fubars;
}
boolean isFooBar(Object o){
for(FooBar f : foobars)
if( f.isFooBar(o) )
return true;
return false;
}
}
ITSは、常にどちらかの真偽値ではない-I'veはよくとして可変オブジェクトでこのパターンを使用しますが、短絡状態が(常にあります例えば、trueを返し、Stringは空のStringであり、フラグがセットされます。
これまで、基本クラスを継承して実装の詳細を継承するという問題を考慮して、これを「責任の連鎖」パターンと呼びました。しかし、今日私は重要な違いを認識しました。チェーンに沿ったオブジェクトはチェーンの残りの部分を中断できません。実装が「これは偽であり、どの条件でも偽であることを保証できます」(nb:短絡はtrue
のみ)と言うことはできません。
これは、チェーンの責任パターン以外のものと呼ばれるべきですか?このアプローチを伝統的なものよりも使用する際に考慮すべき問題や懸案事項はありますか?
私はキーがあなたの「通常は値を返すのではなく何かをする」というコメントだったと思います。私が使用した変種は、一連のテキストフィルタです。 1つのフィルターは、呪いの言葉、別のストップワード、別の数字などを取り除きます。返された結果は、次のものに引き渡されます。フィルタが空の文字列(例えば、呪いフィルタによって処理される呪い語のみからなる文字列)を返す場合、それは短絡する。私の指摘は、パターンがブール値ではなく、イメージフィルタでそれを使用することが想像できます。 – ArtB
@ArtB:データフィルタを使用するあなたの例は、パイプラインやデコレータパターンのように聞こえます。 – rwong