“处理程序”模式?

时间:2009-03-13 04:06:49

标签: c# .net design-patterns

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

public interface IHandler
{
    IDictionary<string, string> Handle(IDictionary<string, string> args);
}

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

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

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

6 个答案:

答案 0 :(得分:9)

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

(它不是单身,BTW)

答案 1 :(得分:2)

我以“SingletonRegistry”的名义使用它

请参阅this thread

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

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

我发现这个class also在网上搜索该名称。

看起来不一样吗?

答案 2 :(得分:2)

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

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

答案 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。