readme

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

需求分析

我们将在接下来的三个项目中实现答疑场景,即:在学习过程中,学生提出问题,老师回答问题。在本项目中我们将使用订阅者模式来实现提问的环节。

步骤一

首先,我们在com.littlewaterdrop.qa包中创建四个新的接口。接口Message定义了两个方法,其原型如下。type()方法返回MessageType类型的对象。MessageType是一个枚举类型,它包含两个枚举值。SIMPLE表示一个简单的问题;COMPLEX表示一个复杂的问题。所以,MessageType也是com.littlewaterdrop.qa包中的一个新类。

field()方法返回MajorEnum类型的对象。MajorEnum表示的是这个问题的专业领域。我们在之前的项目中已定义了com.littlewaterdrop.bean.MajorEnum。

MessageType type();
MajorEnum field();

接口Topic包含两个成员方法。subscribe()方法接收一个Subscriber类型的参数,将该对象添加进订阅者链表中。publish()方法向该Topic接口发布一条消息。所以,publish()方法接收一个Message对象参数。

public interface Topic {
    void subscribe(Subscriber sub);
    void publish(Publisher pub, Message msg);
}

接口Publisher声明了一个成员方法getId(),用于标识发布者的id。

public interface Publisher {
    String getId();
}

接口Subscriber声明了一个成员方法onMessage();它接收一个Message类型的参数,不返回任何结果。onMessage()方法用于处理一条消息。方法getId()用于标识订阅者的id。

public interface Subscriber {
    String getId();
    void onMessage(Message msg);
}

步骤二

在com.littlewaterdrop.qa包中创建一个新类ConcreteTopic,实现接口Topic。在ConcreteTopic类中定义了一个成员变量subscribers,java.util.Set<Subscriber>类型。在publish()方法中会逐一调用Subscriber的onMessage()方法,将消息传递给每一位订阅者。

public class ConcreteTopic implements Topic {
    ...
}

步骤三

在StudentCenter类中,添加成员变量courseTopics;它是一个从课程id到Topic类型的映射(Map);每一个Topic表示在课程上学生向教授提问的通道。

然后,我们再新增一个公有成员方法askQuestion,用于接收学生提出的问题。

public class StudentCenter {
    public void askQuestion(Student theStudent, String courseId, Message msg);
}

步骤四

最后,我们在Student类中新增实现Publisher接口。因为Student类已有了getId()成员方法,所以,我们不需要再为实现Publisher接口添加任何新的代码。但是,我们在Student类中新增一个成员方法askQuestion(),用于实现学生向教授提问题。

public abstract class Student {
    public void askQuestion(Message msg) {
        StudentCenter.getInstance().askQuestion(this, "CS0201", msg);
    }
}

我们在Professor类中新增实现Subscriber接口,用于处理学生提的问题。onMessage()方法的内容暂时留空,我们将在下一个项目中实现其内容。

参考文档

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