在这样的系统中,您似乎可以创建一个包含所有个人属性以及帐户信息的 User 类:
public class User
{
// personal properties
private String name;
private String surname;
private Calendar dateOfBirth;
// account properties;
private String login;
private String password; // note that string may be more convenient than char[]
// role properties
public ArrayList<Role> roles;
...
public bool hasRole(Role role) // or isInRole(Role role)
{ // implementation here. }
}
然后你有你的角色对象:
public class Role
{
private String name;
private String description;
}
请注意,只有一个角色类可以是教师、学生、家长等。由于角色类是通用的,因此我们在其中没有诸如 addGrade() 之类的函数,因为这是特定于教师的。
当用户使用正确的凭据登录时,这样的系统将已经知道与用户关联的角色。通常,特定于角色的选项卡、链接和其他 UI 元素会根据角色显示(或不显示)。您可以在此处检查登录的用户是否具有特定角色(user.hasRole(...))。对于每个可见性由角色确定的 UI 元素,您必须有一个 if (user.hasRole(...))。
在组合问题上,这个系统是一个严重依赖对象之间关系的系统。让我们考虑一下学生和辅导员之间的关系——辅导员有学生分配给他/她。同样,任何给定的学生都有许多辅导员。你有一个多对多的关系,它需要一个结构来跟踪独特的学生辅导员对的组合:
public class StudentCounselor
{
public User student;
public User counselor;
}
谁来跟踪这一切?很可能是系统本身,而不是其他用户。
public class SystemAdministration
{
public static ArrayList<StudentCounselor> studentCounselors = new ArrayList<StudentCounselor>();
public static void addStudentCounselor(User student, User counselor)
{
// Check to see first that the student-counselor combo doesn't exist
studentCounselors.addItem(student, counselor);
// addItem may not be the precise name of the function in ArrayList.
}
// function to obtain all students of a counselor
public static ArrayList<User> getStudentsOfCounselor(User counselor)
{
// iterate through the studentCounselors ArrayList and pick only
// the Student-Counselor whose counselor is the same counselor
// as the one passed into this function.
// Then extract the student property out of the fitting
// Student-Counselor.
// Return the list of students.
}
public static ArrayList<User> getCounselorsOfStudent(User student)
{
// Similar as above, but the other way around.
}
}
你会为你的其他关系做类似的事情——家长-学生、教师-部分等。 SystemAdministration 类不是一个角色,而是负责为你提供所有数据的实体。
作为建议,请考虑 Section 对象:
public class Section
{
public User teacher; // who teaches it
public Course course; // what is the subject, because > 1 teacher might teach the same one.
public TimeBlock timeBlock; // when is this section administered?
public Venue venue; // what room or what facility
}
您必须创建 TimeBlock 和 Venue 类。这种结构,当放入 ArrayList 时将能够回答以下问题:“作为教师,我将教哪些部分?” 这就回答了“我将教他们什么科目、什么时候、在哪里教他们?”这个问题。
至于学生,你需要 StudentSection “组合”类:
public class StudentSection
{
public Section section;
public User student;
}
当放入 SystemAdministrator 类的 ArrayList 时,现在您可以遍历列表以提取分配给学生的部分(也就是学生的日程安排),同样,谁是给定部分的学生。
请注意,除了角色之外,我们在 User 类中没有相关项目的列表。要获取任何数据,只要您在全局(在本例中为 SystemAdministration)结构中拥有所有数据和访问功能,有关登录用户及其角色的信息就足够了。