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