我试图解决调查系统的最佳架构以及要使用的设计模式。 我们有以下类型的问题:
我想要使用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();
}
你能帮我解释一下我想念的内容以及如何合成课程吗?我使用了错误的设计模式吗?
提前致谢!
答案 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()。