4

このパターンに名前があるかどうか知っている人はいますか?私はそれをかなりの量で使用する傾向があります。

基本的には、インターフェイスを実装する列挙可能なクラスをメソッドに提供できるようにする動作パターンであり、それらすべてを実行します。C# の例を次に示します。

interface IInputValidator
{
    bool IsValid(int input);
}

class GreaterThanZeroValidator : IInputValidator
{
    public bool IsValid(int input)
    {
        return input > 0;
    }
}

class LessThanOneThousandValidator : IInputValidator
{
    public bool IsValid(int input)
    {
        return input < 1000;
    }
}

次に、これらを使用する方法:

public void ValidateInput(int input, IEnumerable<IInputValidator> validators)
{
    bool allValid = true;
    foreach(var validator in validators)
    {
        if(!validator.IsValid(input))
            allValid = false;
    }

    if(!allValid)
        throw new ArgumentException();
}

したがって、私には戦略パターンによく似ていますが、通常の戦略パターンは 1 つの戦略だけを使用するのに対し、入力を処理する機会をすべて取得する複数の戦略があります。

これは責任の連鎖にも少し似ていますが、通常の CoR では、ハンドラーは入力を処理できる 1 を見つけるのに十分な深さだけ反復され、各責任には次の責任への参照があります (リンクされたリストのように) )、一方、私の例では、それらをすべてまとめて渡します。

私はちょうどこれに名前を付けようとしています。助けてくれてありがとう!

4

2 に答える 2

1

私見これはChain-Of-Responsibilityです。その理由は、LINQAll拡張機能が、述部がfalseを返す原因となる最初の項目に到達した瞬間に終了するためです。

これが私の主張を証明するLINQPadコードですAll

void Main()
{
    try
    {
        Console.WriteLine("all items are 2?");
        Console.WriteLine(YieldOneThenThrow().All(i => i == 2));
        Console.WriteLine("all items are 1?");
        Console.WriteLine(YieldOneThenThrow().All(i => i == 1));
    }
    catch (NotSupportedException)
    {
        Console.WriteLine("exception! second item was visited.");
    }
}

IEnumerable<int> YieldOneThenThrow()
{
    yield return 1;
    throw new NotSupportedException();
}

...そして出力:

すべてのアイテムは2ですか?
False
すべてのアイテムは1ですか?
例外!2番目のアイテムが訪問されました。

于 2012-08-26T14:43:37.170 に答える
0

しかし、そうです、戦略パターンは設計されており、消費は責任の連鎖です。

ユーザーが何を取得するかによって異なります。ユーザーに ValidateInput が提供されている場合は、CoR として分類します。ユーザーにクラスの最初のセットのみが与えられた場合、それを Strategy と呼びます。

于 2012-08-26T14:12:51.080 に答える