单个和多个对象的MVC模式的实现

问题描述 投票:0回答:3

我已经使用 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(控制器 -> 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(控制器 -> 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();

            }
      }
java design-patterns model-view-controller
3个回答
2
投票

您可以创建

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
课程来做到这一点

此外,基本上一个学生只是一个学生列表,仅包含 一个元素,你可以删除冗余


1
投票

有一些建议:

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.如果你想在一个

控制器中控制多个模型视图对,可以使用Map

来访问。 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.实现 POJO 的 toString() 方法是测试代码的好方法,而不是使用其他方法。
学生.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> singleStudentList = new ArrayList<>(); List<Student> multipleStudentList = new ArrayList<>(); // add test cases singleStudentList.add(new Student("s1", 1)); for (int i = 0; i < 5; i++) { multipleStudentList.add(new Student("s" + i, i)); } StudentModel singleStudentModel = new SingleStudentModel(singleStudentList); StudentModel multipleStudentModel = new MultipleStudentModel(multipleStudentList); 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的示例,以供理解。)

根据我对 MVC 方法的了解,您甚至不应该在模型上拥有功能...... 所以这里有一些核心错误。

0
投票
你应该考虑将所有功能放在View或Controller中,让它们处理事情。 视图应该抛出事件,控制器应该处理它们。

© www.soinside.com 2019 - 2024. All rights reserved.