用模式替换字符串比较

时间:2017-12-30 22:11:44

标签: c# oop design-patterns

我有一个使用Bot框架(https://dev.botframework.com/)开发的机器人,这个机器人应该根据传入的命令来处理特定的事情。

因此,在我的代码中,我有一个包含多个(9个准确)if语句的方法。 (见下面的例子)。解析传入的命令。我正在努力寻找一个好的模式来使代码更好。也许9个if语句可以,但我发现这些语句在将来可能会增加的潜在风险。我一直在关注战略模式,但并不认为它是一个好的候选人。什么模式可以替代多个if语句?

if (text.Contains("command1")) {
   doA();
}

if (text.Contains("command2")) {
   doB();
}

... an so on.

1 个答案:

答案 0 :(得分:1)

您可以使用策略模式。下面是一个简单的例子:

声明:

class ResponseStrategy
{
    private readonly IEnumerable<IInputHandler> _responses;

    public ResponseStrategy(IEnumerable<IInputHandler> responses)
    {
        // TODO protect from null input, etc.
        _responses = responses;
    }

    public ?void? Respond(string input)
    {
        // TODO put error handling in place and expect input to match no handlers
        _responses
            .First(r => r.CanHandle(input))
            .Handle(input);
    }
}

interface IInputHandler
{
    bool CanHandle(string input);
    ?void? Handle(string input);
}

class DoAInputHandler : IInputHandler
{
    public bool CanHandle(string input)
    {
        return input.contains("command1");
    }

    public ?void? Handle(string input)
    {
        // DoA();
    }
}

class DoBInputHandler : IInputHandler
{
    public bool CanHandle(string input)
    {
        return input.contains("command2");
    }

    public ?void? Handle(string input)
    {
        // DoB();
    }
}

设定:

var responses = new List<IInputHandler>
{
    new DoAInputHandler(),
    new DoBInputHandler(),
    // other handlers
};
var responseStrategy = new ResponseStrategy(responses);

用法:

responseStrategy.Respond("asl;daskjnfsd command1 asdsdgdfn");