Java MVC模式在单个和多个对象中的实现
我已经用MVC模式实现了一个学生管理(教程:)。我决定将学生分为“单一学生模型”和“多重学生模型”,但我不确定这在我的案例中是否有意义。总的来说,我对我的解决方案不满意。是否可以使用一个控制器处理单个学生和多个学生? 如果模型导入到视图类中(参见StudentsView.java),可以吗 我如何改进这个项目 提前谢谢 java(模型,数据类(?) SingleStudentModel.java(模型) java(控制器->单学生模型) MultipleStudentModel.java(模型) StudentView.javaJava MVC模式在单个和多个对象中的实现,java,design-patterns,model-view-controller,Java,Design Patterns,Model View Controller,我已经用MVC模式实现了一个学生管理(教程:)。我决定将学生分为“单一学生模型”和“多重学生模型”,但我不确定这在我的案例中是否有意义。总的来说,我对我的解决方案不满意。是否可以使用一个控制器处理单个学生和多个学生? 如果模型导入到视图类中(参见StudentsView.java),可以吗 我如何改进这个项目 提前谢谢 java(模型,数据类(?) SingleStudentModel.java(模型) java(控制器->单学生模型) MultipleStudentModel.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);
}
}
import java.util.List;
public interface StudentView {
void printStudentList(List<Student> students);
}
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);
}
}
import java.util.List;
public class MultipleStudentView implements StudentView {
@Override
public void printStudentList(List<Student> students) {
for (Student s : students) {
System.out.println(s);
}
}
}
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());
}
}
}
您可以创建
model
的接口,以便实现MultipleStudentModel
和SingleStudentModel
两个类
因此,您不需要定义两个基本上共享相同逻辑的控制器,也可以使用setModel
这还将创建一个契约,将您的模型绑定到特定的方法,如get和诸如此类的方法(insert/update/delete)
您也可以使用视图
类来执行此操作
而且,基本上一个学生只是一个学生列表,其中只包含
一个元素,您可以删除该冗余
有一些建议: 1.使用接口而不是类。 您可能听说过,如果您有多个同类对象的实现,例如本例中的
model
和view
,那么这是一种更好的方法。因此,更好的方法是将这两个对象抽象为接口,而不是类:
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);
}
}
import java.util.List;
public interface StudentView {
void printStudentList(List<Student> students);
}
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);
}
}
import java.util.List;
public class MultipleStudentView implements StudentView {
@Override
public void printStudentList(List<Student> students) {
for (Student s : students) {
System.out.println(s);
}
}
}
以下是模型
和视图
的实现:
SingleStudentModel.java
import java.util.List;
public interface StudentModel {
List<Student> getStudents();
}
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;
}
}
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;
}
}
代码结构:
-src
├ view
│ ├ MultipleStudentView.java
│ ├ SingleStudentView.java
│ └ StudentView.java
├ model
│ ├ MultipleStudentModel.java
│ ├ SingleStudentModel.java
│ ├ Student.java
│ └ StudentModel.java
├ controller
│ └ StudentController.java
└ Main.java
这些都是这里的代码,希望有帮助~
(顺便说一句,在典型的JavaEE开发中,模型只是POJO,而视图更常见的是类似字符串的逻辑视图。这只是理解MVC的一个示例。)这更像是一个代码审查问题。我建议您将这些问题发布到codereview.stackexchange.com,而不是Stack Overflow。
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;
}
}
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;
}
}
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);
}
}
import java.util.List;
public class MultipleStudentView implements StudentView {
@Override
public void printStudentList(List<Student> students) {
for (Student s : students) {
System.out.println(s);
}
}
}
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