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();
}

所以对我来说,它看起来很像一个策略模式,但有多种策略都有机会处理输入,而普通的 Strat 模式只接受一种策略。

它也有点像责任链,只是在普通的 CoR 中,处理程序只迭代到足够深以找到可以处理输入的 1,并且每个责任都有对下一个责任的引用(就像链表),而在我的示例中,我将它们一起传递。

我只是想给这件事起个名字。谢谢你的帮助!

4

2 回答 2

1

恕我直言,这是责任链。原因是 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?

所有项目都是1?
例外!访问了第二项。

于 2012-08-26T14:43:37.170 回答
0

但是,是的,策略模式是设计好的,消费是责任链。

这取决于用户将获得什么 - 如果为用户提供了 ValidateInput,我会将其归类为 CoR。如果只为用户提供第一组类,那么我将其称为策略。

于 2012-08-26T14:12:51.080 回答