我有学生管理申请。现在我必须实现这个应用程序的一个新部分,根据学生的成绩提供建议(以文本的形式)。所以我们有 1“算法”和4(目前)不同的文本(变种)作为输出)。
这种情况下最好的模式是什么? 我个人考虑使用桥接模式,以便我可以将算法放在抽象类中,并将不同的文本作为具体的实现者。
答案 0 :(得分:4)
我认为你已经过度工程了。
这是一个非常简单的搜索算法问题。您的域名由学生(需要建议),建议片段(包含知识)和某种类型的提供者组成,其中包含搜索算法以帮助学生找到建议。
使用以下内容,我可以随时更改搜索算法以满足我的需求。我可以创建一个全新的搜索,或修改我已经拥有的搜索。另外,我可以创建一个搜索工具,而不是一个建议列表。我可以通过更新我的StudentAdvice模型并在提供程序中搜索该建议来添加新条件(这些是两个不同的更改,因此它不违反开放/封闭原则)。
class Program
{
static void Main(string[] args)
{
var advices = new[]
{
new StudentAdvice{ Grade = 60, Advice = "Talk to your professor." },
new StudentAdvice{ Grade = 70, Advice = "Spend more time studing." },
new StudentAdvice{ Grade = 80, Advice = "Spend even more time studing." },
new StudentAdvice{ Grade = 90, Advice = "You're doing great, almost there!" },
new StudentAdvice{ Grade = 100, Advice = "Perfect!" },
};
IStudentAdviceProvider adviceProvider = new GradeBasedAdviceProvider(advices);
var student = new Student { Name = "Jim", Grade = 80 };
foreach(var advice in adviceProvider.GetAdvice(student))
{
Console.WriteLine(advice.Advice);
}
}
}
public interface IStudentAdviceProvider
{
IEnumerable<StudentAdvice> GetAdvice(Student student);
}
public class GradeBasedAdviceProvider : IStudentAdviceProvider
{
private readonly IEnumerable<StudentAdvice> advices;
public GradeBasedAdviceProvider(IEnumerable<StudentAdvice> advices)
{
this.advices = advices;
}
public IEnumerable<StudentAdvice> GetAdvice(Student student)
{
// Advice Selection Algorithm
return advices.Where(advice => student.Grade <= advice.Grade).Take(1).ToList();
}
}
public class Student
{
public string Name { get; set; }
public int Grade { get; set; }
}
public class StudentAdvice
{
public int Grade { get; set; }
public string Advice { get; set; }
}
在核心,这可以用作战略模式。但是,我从域开始,模式出现了。拣货模式首先将您编入角落。
学习设计模式为我们提供了大量工具。学习SOLID设计原则使我们能够意识到何时应该使用这些工具。以下网站有一些与OOD相关的优秀资源。
答案 1 :(得分:-1)
在我看来,模板方法模式将是最佳选择。你有一个算法,其中一步(输出)可以变化。所以我会做这样的事情(PHP):
abstract class MyAlgo
{
function executeAlgo()
{
$this->step1();
$this->step2();
$this->output();
}
function step1()
{
...
}
function step2()
{
...
}
abstract function output();
}
class Variation1 extends MyAlgo
{
function output()
{
...
}
}
class Variation2 extends MyAlgo
{
function output()
{
...
}
}