这个设计模式的名称是什么?有点像策略模式和责任链模式。

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中,处理程序仅迭代足够深以找到能够处理输入的处理程序,并且每个责任都引用下一个责任(如链接列表),而在我的示例中,我将它们全部一起传递。

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

2个回答

1

在我看来,这是责任链模式。原因是LINQ All 扩展会在遇到第一个使谓词返回 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吗?
异常!第二个项目已被访问。


好点子。我使用了 Linq 来使示例代码更短。我将编辑我的代码,以便对所有项目进行完整的 foreach。抱歉! - CodingWithSpike
@rally25rs - 没问题。 :) 我做了很多UI工作,这个项目触及到了我的痛处。作为用户,我讨厌的一件事情是当页面只通知我第一个无效项而不是所有需要修复的事情。因此,即使这只是这种模式的一个用途,我也看到了“收集所有问题”的实用性。 - devgeezer
是的,我通常使用它的两个地方是“收集所有验证问题”或“运行所有这些业务规则”。 - CodingWithSpike

0

是的,策略模式是设计出来的,而消费者则是责任链。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接