Есть несколько советов:
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 для понимания.)