使用哪种设计模式以及调查平台如何使用?

Which design pattern to use and how for survey platform?

我正在尝试解决调查系统的最佳架构以及要使用的设计模式。 我们有以下类型的问题:

我想要绘图 API 和验证 API 所以我想出了 "Bridge Pattern" ,它主要用于绘图。但是我缺少一些东西。

我试过的是这样的:

public abstract class Question : IDrawable, IValidatable
{
    protected readonly IQuestionFormatter questionFormatter;
    protected readonly IQuestionValidator validator;

    public string Title { get; set; }

    public Question(IQuestionFormatter questionFormatter, IQuestionValidator validator)
    {
        this.questionFormatter = questionFormatter;
        this.validator = validator;
    }

    public abstract void Draw();

    public abstract bool Validate();

}

    public interface IQuestionValidator
{
    bool ValidateQuestion(IEnumerable<string> userInput, 
                          IEnumerable<string> questionAnswers);
}

    public interface IQuestionFormatter
{
    string FormatQuestion(string title, IEnumerable<string> options);
}

然后我为 MultipleChoiceQuestion、OnePossibleAnswerQuestion 和 ShortAnswer 创建 RefinedAbstractions。问题是 MultipleChoiceQuestion 可以有 许多正确答案和许多 UserInput.

public class MultipleChoiceQuestion : Question
{
    public List<string> Options { get; set; } = new List<string>();
    public List<string> Answers { get; set; } = new List<string>();
    public List<string> UserInput { get; set; } = new List<string>();

    public MultipleChoiceQuestion(IQuestionFormatter questionFormatter, IQuestionValidator validator) : base(questionFormatter, validator)
    {
    }

    public override void Draw()
    {
        var result = questionFormatter.FormatQuestion(Title, Options);
        Console.WriteLine(result);
    }

    public override bool Validate()
    {
        return validator.ValidateQuestion(UserInput, Answers);
    }
}

OnePossibleAnswerQuestion 有 多个答案,但有一个 UserInput

 public class OnePossibleAnswerQuestion : Question
{
    public string UserInput { get; set; }
    public string Answer { get; set; }
    public List<string> Options { get; set; } = new List<string>();

    public OnePossibleAnswerQuestion(IQuestionFormatter questionFormatter, IQuestionValidator validator) : base(questionFormatter, validator)
    {
    }

    public override void Draw()
    {
        var result = questionFormatter.FormatQuestion(Title, Options);
        Console.WriteLine(result);
    }

    public override bool Validate()
    {
        return validator.ValidateQuestion(new List<string> { UserInput }, new List<string> { Answer });
    }
}

ShortAnswer 有 一个答案和一个 UserInput。我不确定如何创建设计。 public class ShortAnswer : 问题 { public 字符串用户输入 { 得到;放; } public 字符串答案{ 得到;放; }

    public ShortAnswer(IQuestionFormatter questionFormatter, IQuestionValidator validator) : base(questionFormatter, validator)
    {
    }

    public override void Draw()
    {
        var result = questionFormatter.FormatQuestion(Title, new List<string> { "" });
        Console.WriteLine(result);
    }

    public override bool Validate()
    {
        return validator.ValidateQuestion(new List<string> { UserInput }, new List<string> { Answer });
    }
}

但是当我到达 OnePossibleAnswerQuestion 或 ShortAnswer 时,.Validate() .Draw() 开始发臭。可能我定义了错误的接口?

我的目标是拥有这样的东西:

    List<Question> questions = new List<Question>();

    // ... add some questions using Builder or Factory Design Pattern

    // draw the questions
    foreach (var question in questions)
    {
        question.Draw();
    }

    // validate the questions
    foreach (var question in questions)
    {
        question.Validate();
    }

你能帮我看看我遗漏了什么以及如何合成 classes 吗?我使用了错误的设计模式吗?

提前致谢!

1) 让你的验证者使用问题而不是输入和答案:

this.validator.Validate(this);

2) 让你的格式化程序使用问题而不是标题和选项:

this.formatter.Format(this);

= 现在您可以将 Validate() 和 Draw() 方法移动到基础 class 中,而不是在每个问题类型中实现。此外,您还可以提供具有新属性的新问题类型,例如音频或图片。

3) 为了使这个有用,您需要使用问题渲染器而不是格式化程序。如果您决定将输入从文本控制台更改为 HTML 页面怎么办?

4) 您还可以为问题添加 GetInput() 方法,使其具有如下内容:

List<Question> questions = new List<Question>();

// draw the questions
foreach (var question in questions)
{
    question.Draw();
    question.GetInput();
    question.Validate();
}

或者您可以只绘制 () 问题并在单击按钮时调用 Validate()。