Oop 命名该模式:使用谓词处理程序对象的集合作为策略

Oop 命名该模式:使用谓词处理程序对象的集合作为策略,oop,design-patterns,Oop,Design Patterns,这包括策略和责任链模式,也许还有规范模式 然而,与典型的策略模式实现不同的是,策略选择是由处理程序对象本身执行的,如责任链和规范,并且可以根据实现应用一个或多个策略 与责任链模式不同,没有链-处理程序不是按层次结构组成的,彼此不知道,而且可能调用多个处理程序 这似乎是一种非常常见的模式,用于支持依赖项反转和开/闭原则的可扩展性,但我无法为其命名。我见过术语处理程序模式,但这似乎又是另一回事 有人能告诉我这个模式叫什么吗?它在某些方面与观察者模式非常相似。 IMessageHandler是观察者,

这包括策略和责任链模式,也许还有规范模式

然而,与典型的策略模式实现不同的是,策略选择是由处理程序对象本身执行的,如责任链和规范,并且可以根据实现应用一个或多个策略

与责任链模式不同,没有链-处理程序不是按层次结构组成的,彼此不知道,而且可能调用多个处理程序

这似乎是一种非常常见的模式,用于支持依赖项反转和开/闭原则的可扩展性,但我无法为其命名。我见过术语处理程序模式,但这似乎又是另一回事


有人能告诉我这个模式叫什么吗?

它在某些方面与观察者模式非常相似。 IMessageHandler是观察者,MessageProcessor是观察对象。诚然,处理程序是在构造期间传递给MessageProcessor的,而不是通过方法添加/删除,并且在构造期间调用处理程序,而不是响应观察对象中的某些更改

public interface IMessageHandler
{
    bool Handles(IMessage message);
    void Handle(IMessage message);
}

public class FooMessageHandler : IMessageHandler …
public class BarMessageHandler : IMessageHandler …

public class MessageProcessor
{
    public MessageProcessor(IEnumerable<IMessageHandler> handlers) …

    public void ProcessMessage(IMessage message)
    {
        foreach(var handler in _handlers.Where(h => h.Handles(message)))
        {
            handler.Handle(message);
        }
    }
}