Я пишу приложение для приема SMS-сообщений через HTTP-шлюз. Основными параметрами, которые я буду обрабатывать, являются номер телефона отправителя и само сообщение. Однако, в зависимости от ключевого слова в сообщении, мне нужно выполнить другую логику/вернуть другой ответ. Для начала я использовал простой 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, но я не уверен. Есть предположения?
Будут ли ответы на различные ключевые слова динамическими/плагинами? Это может повлиять на способ сделать это. – David
Не совсем.Командные процессоры довольно статичны - мне просто нужен лучший способ отвлечь логику от приемника/обработчика команд. – Chris