C# 在这种情况下,什么样的设计模式符合要求?

C# 在这种情况下,什么样的设计模式符合要求?,c#,design-patterns,C#,Design Patterns,我正在编写一个通过HTTP网关接收SMS消息的应用程序。我将处理的主要参数是发送者的电话号码和消息本身。但是,根据消息中的关键字,我需要执行不同的逻辑/返回不同的响应。首先,我使用了一个简单的if/else,它变成了一个switch语句,现在我想把它清理一下 我想我们想要的是某种命令模式的实现,但我不确定。我可以将每个操作实现为一个命令对象,并将它们全部注册到命令处理器,但接下来我必须实现类似CanExecute(…)函数的功能,以确定要执行的适当命令。应执行命令的条件可能取决于多个因素,例如关

我正在编写一个通过HTTP网关接收SMS消息的应用程序。我将处理的主要参数是发送者的电话号码和消息本身。但是,根据消息中的关键字,我需要执行不同的逻辑/返回不同的响应。首先,我使用了一个简单的if/else,它变成了一个switch语句,现在我想把它清理一下

我想我们想要的是某种命令模式的实现,但我不确定。我可以将每个操作实现为一个命令对象,并将它们全部注册到命令处理器,但接下来我必须实现类似CanExecute(…)函数的功能,以确定要执行的适当命令。应执行命令的条件可能取决于多个因素,例如关键字或特定消息内容

我的想法如下:

public interface ISmsCommand 
{
    bool CanExecute(string sender, string message);
    string Execute(string sender, string message);
}

public class SmsHelpCommand : ISmsCommand 
{
    public bool CanExecute(string sender, string message)
    {
        return (message.ToLower().StartsWith("help"));
    }

    public string Execute(string sender, string message) 
    {
        return "For more info, visit...";
    }
}

public class SmsHttpHandler : IHttpHandler
{
    List<ISmsCommand> _commands = new List<ISmsCommand>();

    public bool IsReusable
    {
        get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
        var sender = context.Request.Form[...];
        var message = context.Request.Form["Message"];

        foreach (var command in _commands) 
        {
            if (command.CanExecute(sender, message))
            {
                var response = command.Execute(sender, message);
                SendTextMessage(sender, response);
                break;
            }
        }
    }
}
公共接口ISmsCommand
{
bool CanExecute(字符串发送器、字符串消息);
字符串执行(字符串发送器、字符串消息);
}
公共类SMSHELPCOMAND:ISmsCommand
{
公共布尔CanExecute(字符串发送器、字符串消息)
{
return(message.ToLower().StartsWith(“help”));
}
公共字符串执行(字符串发送器、字符串消息)
{
return“欲了解更多信息,请访问…”;
}
}
公共类SmsHttpHandler:IHttpHandler
{
List _commands=newlist();
公共布尔可重用
{
获取{return true;}
}
公共void ProcessRequest(HttpContext上下文)
{
var sender=context.Request.Form[…];
var message=context.Request.Form[“message”];
foreach(var命令在_命令中)
{
if(command.CanExecute(发送方,消息))
{
var response=command.Execute(发送方,消息);
SendTextMessage(发送者,响应);
打破
}
}
}
}

不过,我觉得这段代码有些可疑。我想我不喜欢将参数同时发送到CanExecute函数和Execute函数,但我不确定。有什么想法吗?

在传递给命令之前,应该提前对消息进行解析。至少足以确定哪个命令适用。换句话说,命令对象不应负责确定消息是否表示该命令。命令的状态方法应仅确定特定命令在给定状态下是否适用。您不必询问每个命令是否需要该消息


我会使用诸如GetBalanceCommand、TransferMoneyCommand等命令,然后使用一个简单的字符串标记器来解析消息,并确定要实例化哪个命令对象,并将标记化的字符串传递给命令的CanExecute/Execute方法。

在传递给命令之前,应该提前完成消息的解析。至少足以确定哪个命令适用。换句话说,命令对象不应负责确定消息是否表示该命令。命令的状态方法应仅确定特定命令在给定状态下是否适用。您不必询问每个命令是否需要该消息


我会使用诸如GetBalanceCommand、TransferMoneyCommand等命令,然后使用一个简单的字符串标记器解析消息,确定要实例化的命令对象,并将标记化的字符串传递给命令的CanExecute/Execute方法。

看看责任链模式。或者您可以将Execute方法重命名为TryExecute并返回bool。

看看责任链模式。或者,您可以将Execute方法重命名为TryExecute并返回bool。

查看命令和命令,我将继续使用命令模式,但请记住模式只是指导原则(尽管我认为这是不言而喻的)

虽然通常在命令模式中,您会向它提供一些东西来执行它的命令。想想SqlCommand对象是如何工作的,给它一个SqlConnection,然后告诉它执行。命令对象使用SqlConnection来执行所需的操作。你把你的脚放在油门踏板上,它会移动所有的连杆,以使汽车走得更快。你不要踩油门然后自己打开油门


我建议您要么给命令提供
SendTextMessage
函数,要么在其构造函数中提供允许该功能的对象(想想SqlConnection)。或者只需使用
Execute
方法以及
sender
消息
即可。这使您能够只允许命令执行其任务。同时允许您通过您提供的
SendTextMessage
功能限制其执行此操作的能力。如果可以,它会这样做,如果不能,因为它不应该给出消息,它不会发送消息。

我会继续使用命令模式,但请记住,模式只是指导原则(尽管我认为这是不言而喻的)

虽然通常在命令模式中,您会向它提供一些东西来执行它的命令。想想SqlCommand对象是如何工作的,给它一个SqlConnection,然后告诉它执行。命令对象使用SqlConnection来执行所需的操作。你把你的脚放在油门踏板上,它会移动所有的连杆,以使汽车走得更快。你不要踩油门然后自己打开油门

我的建议是,要么给命令提供
SendTextMessage
函数,要么提供允许在