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