【发布时间】:2009-12-06 14:09:53
【问题描述】:
我正在编写一个应用程序来通过 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;
}
}
}
}
不过,这段代码在我看来有些可疑。我想我不喜欢将参数同时发送给 CanExecute 函数和 Execute 函数,但我不确定。有什么想法吗?
【问题讨论】:
-
对各种关键字的响应会是动态/插件吗?这可能会影响执行此操作的方式。
-
并非如此。命令处理器是相当静态的——我只是想要一种更好的方法来将逻辑从命令接收器/处理程序中抽象出来。
标签: c# design-patterns