readme

Java面向对象程序设计-课程查询

需求分析

我们在之前的项目中实现了StudentCenter类;该类保存了所有Course对象,并提供了getAllCourses()方法,用于读取所有的课程信息。在本项目中,我们将开发一个新的成员方法,用于提供课程的查询功能。我们将会设计一个新类CourseSearch,用于表示一个查询请求。然后,我们将在StudentCenter中新增一个成员方法findCourse(),用于查询符合条件的课程。其原型如下所示。

public class StudentCenter {
    public Iterator<Course> findCourse(CourseSearch search);
}

该方法返回的Iterator<Course>对象用于遍历所有符合查询条件的课程信息。

步骤一

首先,我们需要在com.littlewaterdrop.search包中声明一个新类CourseSearch,用于表示课程查询对象。该类有一个私有成员变量criteria。该变量的类型是一个链表,链表中的元素类型为java.util.function.Predicate<Course>。

public class CourseSearch {
    private List<Predicate<Course>> criteria;
}

CourseSearch类提供了一个成员方法isSatisfied();该方法接受一个Course对象,返回boolean,表示该课程是否满足当前的查询要求。true表示满足查询要求;false表示不满足查询要求。

public boolean isSatisfied(Course course);

步骤二

在CourseSearch类中,我们创建一个CourseSearchBuilder的内部类,使用建造者模式来创建CourseSearch对象。

在CouseSearch类中,我们声明一个接收criteria的私有构造函数。有了这个私有构造函数,程序无法在其他地方创建CourseSearch类对象。该对象只有通过CourseSearchBuilder类创建。然后,再声明一个公有的、静态方法builder()。该方法不接受任何参数,返回一个CourseSearchBuilder对象。

public class CourseSearch {
    ...
    private CourseSearch(List<Predicate<Course>> criteria) {
        ...
    }

    public static CourseSearchBuilder builder() {
        ...
    }

    public static class CourseSearchBuilder {
        ...
    }
    ...
}

在CourseSearchBuilder中声明两个成员方法。第一个成员方法build(),无参数,返回一个CourseSearch对象。第二个成员方法criterion(),用于向即将创建的CourseSearch对象中添加一项查询条件。两个成员方法的原型如下所示。

public static class CourseSearchBuilder {
    public CourseSearch build() {
        ...
    }

    public CourseSearchBuilder criterion(Predicate<Course> criterion) {
        ...
    }
}

在使用了建造者模式之后,我们可以使用下面的代码创建出CourseSearch对象。

// 创建一个不包含任何查询条件的CourseSearch对象。
CourseSearch noCriterion = CourseSearch.builder().build();

// 创建一个包含两个查询条件的CourseSearch对象
CourseSearch search = CourseSearch.builder()
                                  .criterion(...) // 设置查询条件一
                                  .criterion(...) // 设置查询条件二
                                  .criterion(...) // 设置查询条件三
                                  .build();

步骤三

在StudentCenter类中,新增成员方法findCourse()。该方法接受一个CourseSearch对象,并返回一个Iterator<Course>对象。调用者能够通过该Iterator对象访问所有符合查询条件的课程对象。

public Iterator<Course> findCourse(CourseSearch search);

最后,在com.littlewaterdrop.search包中创建一个新类CourseFilteredIterator,实现了Iterator<Course>接口。它有两个成员变量;第一个成员变量为courseIterator,用于从courseIterator中读取Course对象。第一个成员变量为filter,用于过滤Course对象。

public class CourseFilteredIterator implements Iterator<Course> {
    private Iterator<Course> courseIterator = null;
    private CourseSearch filter = null;

    public CourseFilteredIterator(Iterator<Course> courseIterator, CourseSearch filter) {

    }
    
    ...
}

因此,在StudentCenter类中的findCourse()方法创建并返回的是一个CourseFilteredIterator对象。

public class StudentCenter {
    public Iterator<Course> findCourse(CourseSearch search);
}

参考文档

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