我遇到过一种被称为“处理程序模式”的设计模式,但我无法在任何地方找到对此模式的任何实际引用。它基本上只是一个单方法接口,允许您轻松扩展后端功能,而无需重新编译客户端。对于必须处理许多不同类型请求的Web服务可能很有用。这是一个例子:
public interface IHandler
{
IDictionary<string, string> Handle(IDictionary<string, string> args);
}
args通常会包含一个像“Action”这样的键,其值可以告诉implmentation要做什么。可以传入额外的args以获取更多信息。然后impl传回一个客户“应该”理解的任意args列表。
这是一种反模式,还是伪装的另一种模式?这种设计是推荐的吗?
编辑: 更多信息:我看到这个实现的方式,“root”处理程序将充当其他具体处理程序的调度程序(也许?)。根处理程序有一个“HandlerResolver”,它决定哪个具体的处理程序应该根据它的内容获取消息。也许它实际上就像一个“调度员”模式,虽然我不知道这是否真的是一种模式。我想它也可以在根目录中有一个责任链模式,允许你将一堆具体的处理程序链接起来,然后让他们决定哪一个会处理它。
答案 0 :(得分:9)
这是OOP方式对没有它们的语言进行闭包。它没有“模式”名称,因为在功能语言上它是显而易见的工作方式。在OOP语言,OTOH,你必须做一些工作,所以它似乎是一个可以说是成语。 '汉德勒'听起来不错。
(它不是单身,BTW)
答案 1 :(得分:2)
我以“SingletonRegistry”的名义使用它
请参阅this thread
我已经使用了几次。特别是当事先采取的行动未知(在设计的第一阶段)或应用程序应支持极大的灵活性。
我从文件或数据库加载字典,并创建将在某个“密钥”下处理请求的类的单个实例。
我发现这个class also在网上搜索该名称。
看起来不一样吗?
答案 2 :(得分:2)
因为你的帖子中有“Action”这个词,所以我认为这可能是Command模式的一部分。查看Wiki并搜索“Handler”...也许这会提供更多的洞察力。
答案 3 :(得分:1)
我不知道它是否真的值得推荐,但我实际上不得不在我编写的一些MATLAB应用程序中使用这种模式来模仿对象的类似引用的行为(现在对于更新的版本来说这是不必要的)
具有讽刺意味的是,我实际上称之为“处理程序”。我的对象只是存储了一个包含函数句柄引用(@handler)的字段,而方法只是调用此函数的包装器。例如,对象的重载GET函数只会调用:
object.handler('get',...input argument list...)
我不确定这是否被认为是其他语言中的“好”设计选择。我选择它是出于必要,因为这是我在MATLAB中创建类似引用的行为的唯一方法(处理函数可以访问初始化数据的工作空间,我不需要传入和传出各种方法调用)。最新版本的MATLAB现在有一个HANDLE类,可以更清晰的方式完成这些工作。
答案 4 :(得分:1)
我认为COM避免重新编译的目标要好得多 影响设计。您从中获得了多大的灵活性:
IHandler UserHandler = ...;
Dictionary<string,string> result = UserHandler.Handle(
new Dictionary<string, string>{
{ "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" });
}
答案 5 :(得分:0)
我在遗留代码库中看到了“Handler”类,特别是对于Web服务。从我所看到的情况来看,这些通常会变成一个Adapter,Facade或者一些类似的模式,并且因为处理请求而最终被称为Handler。