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

时间:2015-12-19 11:18:10

标签: c# asp.net design-patterns architecture

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

  • 可以给出一个正确的答案 - 下拉列表或单选按钮
  • 多项选择 - 复选框
  • 是/否 - 带有是/否的单选按钮
  • 短文
  • 长文
  • 数字 - 例如什么时候......?
  • 正确的顺序 - 例如按正确顺序排列答案

我想要使用Drawing API和Validating API 所以我提出了#34; 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 。我不确定如何创建设计。     公共课ShortAnswer:问题     {         public string UserInput {get;组; }         public string答案{get;组; }

    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();
    }

你能帮我解释一下我想念的内容以及如何合成课程吗?我使用了错误的设计模式吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

1)让验证者使用问题但不使用输入和答案:

this.validator.Validate(this);

2)让格式化程序使用问题但不使用标题和选项:

this.formatter.Format(this);

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

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

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

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

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

或者你可以只用Draw()问题并在点击按钮时调用Validate()。