Java代码中的隐式UML三元关联

时间:2018-10-15 08:46:49

标签: java oop uml class-diagram ooad

我目前在用Code实现三元关联时遇到了一些麻烦。 我得到二进制的 但我不确定三元协会。

这是大学中的典型场景。

讲师可以为一个或多个学生教授一门学科
学生只能由一位讲师讲授一门学科
讲师只能教一个学生一个学科

这三个类之间存在三元关联。

下面的UML类图中显示的这三个类之间的关系以及多重性都存在

enter image description here

我已经在互联网上阅读了有关这方面的不同资料,找不到解决方法

如何实现这三个类之间的关联?要么, 通常,有什么方法可以实现类之间的关联(在Java中)?

3 个答案:

答案 0 :(得分:2)

一如既往,这取决于。

实现关联类的通常方法是使用关联数组。在您的示例中,您将(最终)组合使用Lecturer / Subject来访问Student的列表。如果您的要求不同,则可以例如在提供Subject时返回Student / Teacher的列表。

使用数据库时,表Lecturer中的主键为Subject / Student / Teaching。这样可以像上面提到的那样进行单独选择。

我的帽子里有些伪代码:

class Teaching {
  private Hash lectRef; // assoc. array 

  public void addTeaching(Lecturer lect, Student stud, Subject subj) {
    if lectRef[lect.hash] == None { lectRef[lect.hash] = []; }  
    // if none, default an empty array here
    // lect.hash is a unique hash code for the Lecturer object

    lectRef[lect.hash].append((stud, subj); 
    // tuple of student/subject referenced

    // if you need other fast results (e.g. subjects per student or the like) you need to hash them here too
  }

  public [(Stud, Subj)] studSubj (Lecturer lect) {
    return lectRef[lect.hash];  
    // returns the array of student/subject tuples
  }

  // add other result operations like subjects per student as needed
}

答案 1 :(得分:1)

根据阿玛丹(Amadan) 我正在准备答案

由于我是Java新手,语法可能不正确 如果此解决方案有误,请纠正我

//Lecturer class
class Lecturer{
    private List<Klass> klassList; 

    public List<Klass> getKlasses(Klass klassList){
        retrun klassList;
    }

    public List<Klass> addKlasses(Klass klassList){
        this.klassList = klassList;
    }

    teachStudents(){
        klassList = getKlasses()

        for (int i = 0; i < klassList.size(); i++) {
            (klassList.get(i)).teachSubjectToStudent();
        }
    }
}

//Student class
class Student{
    private Klass klass;
    private List<Subject> learnedSubjectList; 

    public void learn(Subject subject){
        learnedSubjectList.add(subject);
    }
}

//Subject class
class Subject{
    private Klass klass;
}

//Klass class
class Klass{
    private Lecturer lecturer;
    private Student student;
    private Subject subject;

    Klass(Lecturer lecturer,Student student,Subject subject){
        private this.lecturer = lecturer;
        private this.student  = student;
        private this.subject  = subject;
    }

    //implimentation of how subject was teach to a student
    public void teachSubjectToStudent(){
        this.student.learn(subject)
    }
}

//this class is use for code execution
public class TestA {
    public static void main(String[] args) {
        Lecturer lecturer = new Lecturer();
        Subject subject   = new Subject();

        Student student1   = new Student();
        Student student2   = new Student();
        Student student3   = new Student();

        Klass klass1 = new Klass(lecturer,student1,subject);
        Klass klass2 = new Klass(lecturer,student2,subject);
        Klass klass3 = new Klass(lecturer,student3,subject);

        List<Klass> list = new ArrayList<Klass>();
        list.add(klass1);
        list.add(klass2);
        list.add(klass3);

        //create association link between lecturer class and klass class list
        lecturer.addKlasses(list);
    }
}

答案 2 :(得分:-1)

通常,您会自行将关联本身建模为实体(不能称为其类Class,因为java.lang.Class已经采用了该类;通常人们将此类命名为{ {1}},很明显它指的是;您也可以使用Klass。然后,您只有TeachingKlassTeacherKlassSubjectKlass之间的二进制关联。在这种情况下,StudentTeacher根本没有关联,除非通过与Student的参与(与其他对相似)间接地关联。