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

时间:2011-11-08 14:12:40

标签: design-patterns

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

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

2 个答案:

答案 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相关的优秀资源。

http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod

答案 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()
    {
        ...
    }
}