在这种情况下,哪种设计模式适合账单?
我正在编写一个应用程序,通过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函数,但我不确定。有什么想法吗?
我将继续与命令模式,但请记住,模式都只是指导方针(虽然我想,不用说)。
虽然通常在命令模式中,它提供了一些东西来执行它的命令。想想SqlCommand对象是如何工作的,你给它SqlConnection并且告诉它执行。命令对象使用SqlConnection来执行所需的操作。你把脚放在油门踏板上,它会移动所有的连杆,以便使车更快。你不要踩油门踏板,然后自己打开油门。
我会建议的是,你要么命令SendTextMessage
函数或对象,允许在其构造函数中的功能(想到SqlConnection)。或者只需要使用Execute
方法以及sender
和message
。这使您能够让命令完成它的工作。同时允许您通过您提供的SendTextMessage
功能限制其执行此功能的能力。它会做到这一点,如果它可以和它不能,因为它不应该给出消息,它不会发送消息。
消息的解析应该在传递给命令之前提前完成。至少足以确定哪个命令适用。换句话说,确定消息是否代表该命令不应该是命令对象的责任。命令的状态方法只应该确定某个特定命令是否适用于给定状态。你不应该问每个命令是否需要消息。
我会得到像GetBalanceCommand,TransferMoneyCommand等命令。然后有一个简单的字符串标记器解析消息并确定哪个命令对象实例化并将标记字符串传递给命令的CanExecute/Execute方法。
看看责任链模式。 http://www.dofactory.com/patterns/PatternChain.aspx。或者,您可以将您的Execute方法重命名为TryExecute并返回一个布尔值。
对各个关键字的回应是动态/插件吗?这可能会影响到做到这一点的方式。 – David 2009-12-07 14:11:14
不是。命令处理器非常静态 - 我只是想要一个更好的方法将逻辑从命令接收器/处理器中抽象出来。 – Chris 2009-12-07 14:27:40