Design patterns 我应该使用什么设计模式?

Design patterns 我应该使用什么设计模式?,design-patterns,Design Patterns,我有一份学生管理申请。现在我必须实现这个应用程序的一个新部分,根据学生的成绩给出建议(以文本的形式)。因此,我们有1个“算法”和4个(目前)不同的文本(变体)作为输出) 这种情况下最好的模式是什么? 我个人考虑使用桥接模式,以便将算法放入抽象类,并将不同的文本作为具体的实现者。在我看来,模板方法模式将是最佳选择。您有一个算法,其中一个步骤(输出)可以变化。因此,我将这样做(PHP): 在我看来,模板方法模式将是最佳选择。您有一个算法,其中一个步骤(输出)可以变化。因此,我将这样做(PHP): 我

我有一份学生管理申请。现在我必须实现这个应用程序的一个新部分,根据学生的成绩给出建议(以文本的形式)。因此,我们有1个“算法”和4个(目前)不同的文本(变体)作为输出)

这种情况下最好的模式是什么?
我个人考虑使用桥接模式,以便将算法放入抽象类,并将不同的文本作为具体的实现者。

在我看来,模板方法模式将是最佳选择。您有一个算法,其中一个步骤(输出)可以变化。因此,我将这样做(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; }
}