“处理程序”模式?

我遇到过一种被称为“处理程序模式”的设计模式,但我无法在任何地方找到对此模式的任何实际引用。 它基本上只是一个单方法接口,允许您轻松扩展后端function,而无需重新编译客户端。 对于必须处理许多不同类型请求的Web服务可能很有用。 这是一个例子:

public interface IHandler { IDictionary Handle(IDictionary args); } 

args通常包括一个像“Action”这样的键,其值可以告诉implmentation要做什么。 可以传入额外的args以获取更多信息。 然后,impl传回客户端“应该”理解的任意args列表。

这是一种反模式,还是伪装的另一种模式? 这种设计是推荐的吗?

编辑:更多信息:我看到这个实现的方式,“根”处理程序将充当其他具体处理程序的调度员(也许?)。 根处理程序有一个“HandlerResolver”,它决定哪个具体的处理程序应该根据它的内容获取消息。 也许它实际上就像一个“调度员”模式,虽然我不知道这是否真的是一种模式。 我想它也可能在根目录中有一个责任链模式,允许你将一堆具体的处理程序链接在一起,然后让他们决定哪一个会处理它。

这是OOP方式对没有它们的语言进行闭包。 它没有’模式’名称,因为在function语言上它是明显的工作方式。 在OOP语言,OTOH,你必须做一些工作,所以它似乎是一个可以说是成语。 ‘汉德勒’听起来不错。

(它不是单身,BTW)

我以“SingletonRegistry”的名义使用它

看到这个post

我已经使用了几次。 特别是当前采取的操作未知(在设计的第一阶段)或应用程序应支持极大的灵活性。

我从文件或数据库加载字典,并创建将在特定“密钥”下处理请求的类的单个实例。

我发现这个类也在网上搜索该名称。

看起来一样不是吗?

因为你的post中有“Action”这个词,所以我认为这可能是Command模式的一部分。 查看Wiki并搜索“Handler”…也许这会提供更多的洞察力。

http://en.wikipedia.org/wiki/Command_pattern

我不知道它是否真的值得推荐,但我实际上不得不在我编写的一些MATLAB应用程序中使用这种模式来模仿对象的类似引用的行为(现在对于新版本来说这是不必要的)。

具有讽刺意味的是,我实际上称之为“处理程序”。 我的对象只是存储了一个包含函数句柄引用(@handler)的字段,而方法只是调用此函数的包装器。 例如,对象的重载GET函数只会调用:

 object.handler('get',...input argument list...) 

我不确定这是否被认为是其他语言的“好”设计选择。 我选择它是出于必要,因为这是我在MATLAB中创建类似引用行为的唯一方法(处理程序函数可以访问初始化数据的工作空间,我不需要传入和传出各种方法调用)。 最新版本的MATLAB现在有一个HANDLE类,可以更清晰的方式完成这些工作。

我认为,受COM影响的设计可以更好地实现避免重新编译的目标。 您从中获得了多大的灵活性:

 IHandler UserHandler = ...; Dictionary result = UserHandler.Handle( new Dictionary{ { "Action", "AddUser" }, { "UserName", "Joe Bloggs" }, { "Age", "23" } }); NewUserId = Int.Parse(result["UserId"]); 

过度:

 IUserHandler UserHandler = ...; AddUserResult result = UserHandler.AddUser(new AddUserArgs { UserName = "Joe Bloggs", Age = 23 }); NewUserId = result.UserId; 

当你可以扩展动作,结果和参数时:

 IUserHandler UserHandler = ...; AddUserResult2 result = UserHandler.AddUser(new AddUserArgs2 { UserName = "Joe Bloggs", Age = 23, Password = "xyzzy" }); NewUserId = result.UserId; SessionId = result.SessionId; IUserHandler2 UserHandler2 = UserHandler as IUserHandler2; if (UserHandler2 != null) { LoginUserResult loginResult = UserHandler2.LoginUser(new LoginUserArgs { UserId = NewUserId, SessionId = SessionId, Password = "xyzzy" }); } 

我在遗留代码库中看到了“Handler”类,特别是对于Web服务。 从我所看到的情况来看,这些通常会变成一个Adapter,Facade或者一些类似的模式,并且因为它处理一个请求而最终被称为Handler。