readme

Java面向对象程序设计-答疑(三)

需求分析

在上个项目中我们实现了学生提问,教授答疑的功能。可是,在实际应用中,教授并不可能回答所有问题。总会有一些问题,需要与其他教授一起讨论之后,才能回答。例如,当问到跨学科的问题时(比如:在计算机课程上问到计算物理课程的问题时),计算机专业的教授需要和物理专业的教授讨论。这样的例子还有很多。因此,我们将在本项目中使用中介者模式实现这个场景。当教授遇到不能解答的问题时,将问题转交给一个中介者HelpCenter。HelpCenter会根据该问题的专业领域,将其转交给相应专业的教授处理。

步骤一

首先,我们在com.littlewaterdrop.qa包中定义一个新类ComplexQuestion,实现了Message接口。ComplexQuestion包含两个成员变量;第一个是field,com.littlewaterdrop.bean.MajorEnum类型,表示该问题的专业领域;第二个是Message,表示原始的问题内容。

步骤二

我们在定义一个新类,HelpCenter。HelpCenter扮演的是中介者模式中的中介者(Mediator)。它定义了两个成员方法。registerHelper()方法注册帮助回答问题的帮助者(Helper)。help()方法则发布一则求助信息。这两个方法的原型如下。

public class HelpCenter {
    public void registerHelper(MajorEnum field, Helper helper);
    public void help(ComplexQuestion question);
}

我们再在com.littlewaterdrop.qa包中新增一个接口Helper。它有一个成员方法onHelp(),用于为问题提供帮助。

public interface Helper {
    void onHelp(ComplexQuestion msg);
}

我们再扩展Professor类,使之实现Helper接口。

步骤三

最后,我们再修改Professor类的onMessage()方法。当遇到不能处理的问题时,将问题包装成一个ComplexQuestion对象,并将其传递给HelpCenter。HelpCenter会根据问题的类型,转发给相应专业的教授。

public class Professor {
    @Override
    public void onMessage(Message msg) {
        if (msg.field().equals(this.field)) {
            System.out.println("I can help on this message");
        } else {
            HelperCenter.getInstance().help(new ComplexQuestion(MajorEnum.Biology, msg));
        }
    }
}

参考文档

  1. Java编程语言的基本概念
  2. 设计模式
  3. Maven工程管理工具
Copyright  2019 Little Waterdrop, LLC. All Rights Reserved.