HTTP 게이트웨이를 통해 SMS 메시지를 수신하는 응용 프로그램을 작성하고 있습니다. 처리 할 주요 매개 변수는 발신자의 전화 번호와 메시지 자체입니다. 그러나 메시지 내의 키워드에 따라 다른 논리를 실행하거나 다른 응답을 반환해야합니다. 우선, switch 문으로 바뀐 간단한 if/else를 사용했습니다. 이제는 조금 깔끔하게 정리하려고합니다.이 시나리오에서 청구서에 맞는 디자인 패턴은 무엇입니까?
내가 원하는 것은 명령 패턴의 일종의 구현이라고 생각하지만 확실하지 않습니다. 각 작업을 명령 개체로 구현하고 명령 프로세서로 모두 등록 할 수는 있지만 실행하기 적합한 명령을 결정하기 위해 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