Реализация шаблона MVC для одного и нескольких объектов - PullRequest
0 голосов
/ 28 апреля 2018

Я реализовал администрирование студентов с использованием шаблона MVC (Учебное пособие: Ссылка ). Я решил разделить студентов на «SingleStudentModel» и «MultipleStudentModel», но я не уверен, имеет ли это смысл в моем случае. В общем, я не удовлетворен своим решением. Можно ли работать с одним и несколькими учениками с помощью одного контроллера? Это нормально, если импорт модели в класс представления (см. StudentsView.java)?

Как я могу улучшить этот проект?

Заранее спасибо.

Student.java (Модель, класс данных (?))

public class Student {

    private String name;
    private int nr;

    public Student(String _name, int _nr){
        this.name = _name;
        this.nr = _nr;
    }

    // get set
}

SingleStudentModel.java (модель)

public class SingleStudentModel {
    private Student student;

    // get set
}

StudentController.java (Controller -> SingleStudentModel)

public class StudentController {
    private SingleStudentModel model;
    private StudentView view;

    public StudentController(SingleStudentModel _model, StudentView _view){
        this.model = _model;
        this.view = _view;
    }

   // set get

    public void updateView(){
        view.printStudentDetails(model.getStudent().getName(), model.getStudent().getNr());
    }
}

MultipleStudentModel.java (модель)

public class MultipleStudentModel {
    private Collection<Student> students = new ArrayList<Student>();

    public Collection<Student> getStudents() {
        return students;
    }

    public void setStudents(Student student){
        this.students.add(student);
    }
}

StudentsController.java (Controller -> StudentsModel)

public class StudentsController {
    private MultipleStudentModel model;
    private StudentsView view;

    public StudentsController(MultipleStudentModel _model, StudentsView _view){
        this.model = _model;
        this.view = _view;
    }

    public void updateView(){
        view.printStudentList(model.getStudents());
    }
}

StudentView.java

public class StudentView {
    public void printStudentDetails(String _name, int _nr){
        System.out.println("Student: ");
        System.out.println("name: " + _name);
        System.out.println("nr: " + _nr);
    }
}

StudentsView.java

import com.mvc.model.Student;

import java.util.Collection;

public class StudentsView {

    public void printStudentList(Collection<Student> students){

        System.out.println("\nStudent list");

        for(Student item : students){
            System.out.println("name: " + item.getName());
            System.out.println("nr: " + item.getNr());
        }
    }
}

Main.java

 public class Main {

       public static void main(String [] args){

            //Single student
            SingleStudentModel model = new SingleStudentModel();
            StudentView view = new StudentView();
            StudentController controller = new StudentController(model, view);

            model.setStudent(new Student("John", 1));

            controller.updateView();

            //Multiple student
            MultipleStudentModel model2 = new MultipleStudentModel();
            StudentsView view2 = new StudentsView();
            StudentsController controller2 = new StudentsController(model2, view2);

            model2.setStudents(new Student("Zelda", 2));
            model2.setStudents(new Student("Link", 3));

            controller2.updateView();

            }
      }

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Есть несколько советов:

1. используйте интерфейс вместо класса.

Возможно, вы слышали о основанном на интерфейсе программировании , что является лучшим способом, если у вас есть несколько реализаций одного и того же типа объекта, например model и view в этом примере. Так что лучше всего абстрагировать эти два интерфейса вместо классов:

StudentView.java

import java.util.List;

public interface StudentView {
    void printStudentList(List<Student> students);
}

StudentModel.java

import java.util.List;

public interface StudentModel {
    List<Student> getStudents();
}

их удобно реализовывать в любое время.

2. если вы хотите управлять несколькими парами вида модели в одном контроллере, можно использовать карту для доступа.

StudentController.java

import java.util.HashMap;
import java.util.Map;

public class StudentController {
    //    private StudentModel model;
    //    private StudentView view;

    private Map<StudentModel, StudentView> modelAndViews;  // store model-view couple

    public StudentController() {
        this.modelAndViews = new HashMap<>();
    }
    public void updateView(StudentModel model) {
        StudentView v = this.modelAndViews.get(model);
        if (v == null)  return; 
        v.printStudentList(model.getStudents());
    }
    public void addModelAndView(StudentModel model, StudentView view) {
        // validate for null pointer
        // if (...)
        this.modelAndViews.put(model, view); // add new model-view couple
    }
    // other methods
}

3. Реализация метода toString () в POJO - это хороший способ проверить ваш код, а не делать это другими методами.

Student.java

public class Student {
    private String name;
    private int rollNo;
    public Student(String name, int rollNo) {
        this.name = name;
        this.rollNo = rollNo;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getRollNo() {
        return rollNo;
    }
    public void setRollNo(int rollNo) {
        this.rollNo = rollNo;
    }
    @Override
    public String toString() {
        return "Student (name=" + name + ", rollNo=" + rollNo + ")";  // for testing
    }
}

Вот реализации model и view:

SingleStudentModel.java

import java.util.List;

public class SingleStudentModel implements StudentModel {

    private List<Student> students; // store one student;   

    public SingleStudentModel(List<Student> students) {
        this.students = students;
    }
    @Override
    public List<Student> getStudents() {
        return this.students;
    }
}

MultipleStudentModel.java

import java.util.List;

public class MultipleStudentModel implements StudentModel {

    private List<Student> students;

    public MultipleStudentModel(List<Student> students) {
        this.students = students;
    }
    @Override
    public List<Student> getStudents() {
        return this.students;
    }
}

SingleStudentView.java

import java.util.List;

public class SingleStudentView implements StudentView {

    @Override
    public void printStudentList(List<Student> students) {
        Student s = students.get(0);
        System.out.println(s);
    }
}

MultipleStudentView.java

import java.util.List;

public class MultipleStudentView implements StudentView {

    @Override
    public void printStudentList(List<Student> students) {
        for (Student s : students) {
            System.out.println(s);
        }
    }
}

(эти два представления можно объединить в одно, а два легче понять :))

наконец, это основной класс:

Main.java

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {

        List<Student> student = new ArrayList<>();
        List<Student> students = new ArrayList<>();
        // add test cases
        student.add(new Student("s1", 1));
        for (int i = 0; i < 5; i++) {
            students.add(new Student("s" + i, i));
        }

        StudentModel singleStudentModel = new SingleStudentModel(student);
        StudentModel multipleStudentModel = new MultipleStudentModel(students);

        StudentView singleStudentView = new SingleStudentView();
        StudentView multipleStudentView = new MultipleStudentView();


        StudentController controller = new StudentController();

        controller.addModelAndView(singleStudentModel, singleStudentView);
        controller.addModelAndView(multipleStudentModel, multipleStudentView);

        System.out.println("---------- update single student's view ---------------");
        controller.updateView(singleStudentModel);
        System.out.println("---------- update multiple students' views ---------------");
        controller.updateView(multipleStudentModel);
    }
}

решение:

---------- update single student's view ---------------
Student (name=s1, rollNo=1)
---------- update multiple students' views ---------------
Student (name=s0, rollNo=0)
Student (name=s1, rollNo=1)
Student (name=s2, rollNo=2)
Student (name=s3, rollNo=3)
Student (name=s4, rollNo=4)

структура кода:

-src
├ view
│  ├ MultipleStudentView.java
│  ├ SingleStudentView.java
│  └ StudentView.java
├ model
│  ├ MultipleStudentModel.java
│  ├ SingleStudentModel.java
│  ├ Student.java
│  └ StudentModel.java
├ controller
│  └ StudentController.java
└ Main.java

Это все коды, надеюсь, поможет ~

(Кстати, в типичной разработке JavaEE модель - это только POJO, а представление - это логическое представление, подобное String. Это только пример MVC для понимания.)

0 голосов
/ 28 апреля 2018

вы можете создать интерфейс model, чтобы оба класса MultipleStudentModel и SingleStudentModel реализовали

, поэтому вам не нужно определять два контроллера, которые в основном используют одну и ту же логику, также это позволит вам изменить поведение контроллера во время выполнения с помощью setModel

это также создаст контракт для привязки вашей модели к определенным методам, таким как get и тому подобное (вставка / обновление / удаление)

public class StudentController {
    private Model model;
    private StudentView view;

    public StudentController(Model _model, StudentView _view){
        this.model = _model;
        this.view = _view;
    }

    public setModel(Model model){
         this.model = model;
    }


}

Вы можете сделать это также с View классами

Кроме того, в основном один студент просто список студентов содержит только один элемент, вы можете удалить эту избыточность

...