Design patterns 我应该使用什么设计模式?
我有一份学生管理申请。现在我必须实现这个应用程序的一个新部分,根据学生的成绩给出建议(以文本的形式)。因此,我们有1个“算法”和4个(目前)不同的文本(变体)作为输出) 这种情况下最好的模式是什么?Design patterns 我应该使用什么设计模式?,design-patterns,Design Patterns,我有一份学生管理申请。现在我必须实现这个应用程序的一个新部分,根据学生的成绩给出建议(以文本的形式)。因此,我们有1个“算法”和4个(目前)不同的文本(变体)作为输出) 这种情况下最好的模式是什么? 我个人考虑使用桥接模式,以便将算法放入抽象类,并将不同的文本作为具体的实现者。在我看来,模板方法模式将是最佳选择。您有一个算法,其中一个步骤(输出)可以变化。因此,我将这样做(PHP): 在我看来,模板方法模式将是最佳选择。您有一个算法,其中一个步骤(输出)可以变化。因此,我将这样做(PHP): 我
我个人考虑使用桥接模式,以便将算法放入抽象类,并将不同的文本作为具体的实现者。在我看来,模板方法模式将是最佳选择。您有一个算法,其中一个步骤(输出)可以变化。因此,我将这样做(PHP):
在我看来,模板方法模式将是最佳选择。您有一个算法,其中一个步骤(输出)可以变化。因此,我将这样做(PHP):
我认为你设计得太过火了 这是一个非常简单的搜索算法问题。您的域由学生(需要建议)、建议片段(包含知识)和某种提供者组成,这些提供者将包含帮助学生找到建议的搜索算法 使用下面的方法,我可以随时简单地更改搜索算法以满足我的需要。我可以创建一个全新的搜索,也可以修改已有的搜索。此外,我还可以创建一个搜索,它使用数据库而不是建议列表。我可以通过更新我的StudentAdvice模型并在提供者中搜索该建议来添加新标准(这是两个不同的更改,因此不会违反开放/关闭原则)
类程序
{
静态void Main(字符串[]参数)
{
var=新[]
{
新学生建议{Grade=60,Advice=“和你的教授谈谈。”},
新学生建议{Grade=70,Advice=“花更多时间学习。”},
新学生建议{Grade=80,Advice=“花更多的时间学习。”},
新学生建议{Grade=90,Advice=“你做得很好,快到了!”),
新学生建议{Grade=100,Advice=“完美!”},
};
IStudentAdviceProvider adviceProvider=新的基于等级的设备提供商(adviceProvider);
var student=新学生{Name=“Jim”,年级=80};
foreach(adviceProvider.GetAdvice(学生)中的var通知)
{
Console.WriteLine(advice.advice);
}
}
}
公共接口是udentAdviceProvider
{
IEnumerable GetAdvice(学生);
}
公共类GradeBasedViceProvider:IStudentAdviceProvider
{
私人只读IEnumerable通知;
基于公共等级的ViceProvider(IEnumerable Advice)
{
这.建议=建议;
}
公共IEnumerable GetAdvice(学生)
{
//建议选择算法
返回建议。Where(advice=>student.Grade我认为你设计得太过分了
这是一个非常简单的搜索算法问题。您的域由学生(需要建议)、建议片段(包含知识)和某种提供者组成,其中将包含一个搜索算法以帮助学生找到建议
使用以下方法,我可以随时简单地更改搜索算法以满足我的需要。我可以创建一个全新的搜索,也可以修改我已有的搜索。此外,我可以创建一个基于数据库而不是建议列表的搜索。我可以通过更新我的StudentAdvice模型并搜索来添加新的条件提供程序内的建议(这是两个不同的更改,因此不会违反打开/关闭原则)
类程序
{
静态void Main(字符串[]参数)
{
var=新[]
{
新学生建议{Grade=60,Advice=“和你的教授谈谈。”},
新学生建议{Grade=70,Advice=“花更多时间学习。”},
新学生建议{Grade=80,Advice=“花更多的时间学习。”},
新学生建议{Grade=90,Advice=“你做得很好,快到了!”),
新学生建议{Grade=100,Advice=“完美!”},
};
IStudentAdviceProvider adviceProvider=新的基于等级的设备提供商(adviceProvider);
var student=新学生{Name=“Jim”,年级=80};
foreach(adviceProvider.GetAdvice(学生)中的var通知)
{
Console.WriteLine(advice.advice);
}
}
}
公共接口是udentAdviceProvider
{
IEnumerable GetAdvice(学生);
}
公共类GradeBasedViceProvider:IStudentAdviceProvider
{
私人只读IEnumerable通知;
基于公共等级的ViceProvider(IEnumerable Advice)
{
这.建议=建议;
}
公共IEnumerable GetAdvice(学生)
{
//建议选择算法
返回建议。其中(建议=>student.Grade将查看模板方法。谢谢:)这打破了SRP。如果我想运行学生建议的报告而不是向学生显示,我需要更改什么?如果我需要按其他条件搜索,我需要更改什么部分?如果我开始将建议存储在数据库中,我需要更改什么部分?将查看模板方法。谢谢:)这打破了SRP。如果我想运行学生建议的报告而不是向学生显示,我需要更改什么?如果我需要按其他条件搜索,我需要更改什么部分?如果我开始将建议存储在数据库中,我需要更改什么部分?我仍处于使用模式的学习阶段。感谢警告!:)我仍处于使用模式的学习阶段。谢谢你的警告!:)
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()
{
...
}
}
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; }
}