这个设计模式的名称?有点像战略和响应链

时间:2012-08-26 14:04:17

标签: design-patterns

有谁知道这个模式是否有名字?我倾向于使用它相当多。

基本上,它是一种行为模式,允许您提供一个方法,该方法具有实现接口的可枚举类,并且它运行所有这些类。这是一个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模式只需要1种策略。

它也有点像责任链,除了在正常的CoR中,处理程序只能迭代到足以找到可以处理输入的1,并且每个职责都有对下一个职责的引用(如链接列表),而在我的例子中,我将它们全部传递到一起。

我只是想为这件事命名。谢谢你的帮助!

2 个答案:

答案 0 :(得分:1)

恕我直言,这是责任链。原因是LINQ All扩展名在到达导致谓词返回false的第一个项目时终止。

这是用于证明我对All

的主张的LINQPad代码
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?   例外!第二个项目被访问了。

答案 1 :(得分:0)

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

这取决于用户将获得的内容 - 如果为用户提供了ValidateInput,我将其归为CoR。如果用户只获得第一组课程,那么我称之为策略。