Task 15 — MVC паттерн

Разделение модели, представления и контроллера.

Edit on GitHub

Задание

Разделение модели, представления и контроллера. Документация собрана по исходному коду этой практики.

Решение

Полный код решения по этой практике:

Исходные файлы решения

  • Task15/Employee.java
  • Task15/EmployeeController.java
  • Task15/EmployeeView.java
  • Task15/Movie.java
  • Task15/MovieController.java
  • Task15/MovieView.java
  • Task15/MVCPatternDemoEmployee.java
  • Task15/MVCPatternDemoMovie.java
  • Task15/MVCPatternDemoStudent.java
  • Task15/Student.java
  • Task15/StudentController.java
  • Task15/StudentView.java

Task15/Employee.java

Task15/Employee.java
package Task15;
public class Employee {
    private String Name;
    private  double salary;
    public String getName() {
        return Name;
    }
    public void setName(String name) {
        Name = name;
    }
    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

Task15/EmployeeController.java

Task15/EmployeeController.java
package Task15;
public class EmployeeController {
    private Employee model;
    private EmployeeView view;
    public EmployeeController(Employee model, EmployeeView view) {
        this.model = model;
        this.view = view;
    }
    public void setEmployeeName(String name){
        model.setName(name);
    }
    public String getEmployeeName(){
        return model.getName();
    }
    public void setEmployeeSalary(double salary){
        model.setSalary(salary);
    }
    public double getEmployeeSalary(){
        return model.getSalary();
    }
    public void updateView(){
        view.printEmployeeDetails(model.getName(), model.getSalary());
    }
    public void nds(){
        model.setSalary(model.getSalary() - (model.getSalary()*0.13));
    }
    public void theend(String e){
        view.printEnd(e);
    }
}

Task15/EmployeeView.java

Task15/EmployeeView.java
package Task15;

public class EmployeeView {
    public void printEmployeeDetails(String name, double salary){
        System.out.println("Имя: " + name);
        System.out.println("Зарплата: "+salary);
    }
    public void printEnd(String e){
        System.out.println("End: "+e);
    }
}

Task15/Movie.java

Task15/Movie.java
package Task15;

public class Movie {
    private String opis;
    private String date;

    public Movie(String opis, String date) {
        this.opis=opis;
        this.date=date;
    }

    public String getOpis() {
        return opis;
    }

    public void setOpis(String opis) {
        this.opis = opis;
    }
    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }
}

Task15/MovieController.java

Task15/MovieController.java
package Task15;

public class MovieController {
    private Movie model;
    private MovieView view;
    public MovieController(Movie model, MovieView view){
        this.model = model;
        this.view = view;
    }
    public void updet(String imagePath, String date, String opis){
        model.setDate(date);
        model.setOpis(opis);
        view.updateView(imagePath, date, opis);
    }

}

Task15/MovieView.java

Task15/MovieView.java
package Task15;

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class MovieView extends JFrame {
    private JLabel name_movie;
    private JLabel prince;
    private JLabel time;

    MovieView() throws IOException, InterruptedException {
        super("Расписание кино");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        name_movie = new JLabel();
        prince = new JLabel();
        time = new JLabel();

        JPanel panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.setBackground(new Color(255,255,255));
        panel.add(Box.createVerticalGlue());

        JPanel imagePanel = new JPanel();
        imagePanel.setPreferredSize(new Dimension(800, 600));
        imagePanel.setMaximumSize(new Dimension(800, 600));
        imagePanel.setBackground(new Color(255,255,255));
        imagePanel.add(name_movie);

        panel.add(imagePanel);
        imagePanel.setAlignmentX(Component.CENTER_ALIGNMENT);

        panel.add(prince);
        panel.add(Box.createRigidArea(new Dimension(0, 20)));

        prince.setAlignmentX(Component.CENTER_ALIGNMENT);
        time.setAlignmentX(Component.CENTER_ALIGNMENT);

        panel.add(time);
        time.setMaximumSize(new Dimension(1000, 250));

        panel.add(Box.createVerticalGlue());

        getContentPane().add(panel);
        setSize(800, 800);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public void setImage(String filename) {

        try {
            BufferedImage img = ImageIO.read(new File(filename));
            JLabel picture = new JLabel();
            picture.setIcon(new ImageIcon(img));
        } catch (IOException e) {
            System.out.println("Ошибка при получении картинки");
        }
    }
    public void updateView(String imagePath, String date, String description){
        name_movie.setIcon(new ImageIcon(imagePath));
        prince.setText(date);
        time.setText("<html><body style='width: 100%;'>"+ description +"</body></html>");
    }
}

Task15/MVCPatternDemoEmployee.java

Task15/MVCPatternDemoEmployee.java
package Task15;

public class MVCPatternDemoEmployee {
    public static void main(String[] args){
        Employee model = retriveEmployeeFromDa();
        EmployeeView view = new EmployeeView();
        EmployeeController controller = new EmployeeController(model, view);
        controller.updateView();
        controller.nds();
        //controller.setEmployeeSalary(30000);
        System.out.println("С вычитом подоходового налога");
        controller.updateView();
        controller.theend("Завершение работы");
    }

    private static Employee retriveEmployeeFromDa() {
        Employee model = new Employee();
        model.setName("Артем");
        model.setSalary(30000);
        return model;
    }
}

Task15/MVCPatternDemoMovie.java

Task15/MVCPatternDemoMovie.java
package Task15;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
import java.io.IOException;

public class MVCPatternDemoMovie {
    public static void main(String[] args) throws IOException, InterruptedException {
        Movie model = new Movie("Дата показа 12.12.2023", "Когда речь идет о деньгах, совесть молчит. А уж если речь об огромных деньгах!.. Это основанная на реальных событиях история нескольких провидцев, которые независимо друг от друга предсказали мировой экономический кризис 2008 года задолго до того, как о нем зашептались в кулуарах на Уолл-стрит. И предсказав, стали на нем зарабатывать. Сами того не желая.");
        MovieView view = new MovieView();
        MovieController controller = new MovieController(model, view);
        controller.updet("D:\\IdeaProjects\\untitled\\src\\Task15\\2.jpg", model.getOpis(), model.getDate());
        view.addMouseListener(new MouseAdapter() {
            int click = 1;

            @Override
            public void mouseClicked(MouseEvent e) {
                switch (click) {
                    case 0:
                        controller.updet("D:\\IdeaProjects\\untitled\\src\\Task15\\2.jpg", "Дата показа 13.12.2023", "Когда речь идет о деньгах, совесть молчит. А уж если речь об огромных деньгах!.. Это основанная на реальных событиях история нескольких провидцев, которые независимо друг от друга предсказали мировой экономический кризис 2008 года задолго до того, как о нем зашептались в кулуарах на Уолл-стрит. И предсказав, стали на нем зарабатывать. Сами того не желая.");
                        break;
                    case 1:
                        controller.updet("D:\\IdeaProjects\\untitled\\src\\Task15\\3.jpg", "Дата показа 14.12.2023", "Нью-йоркский финансист Джордан Белфорт в конце 80-х годов основал одну из крупнейших брокерских компаний, но через десять лет его осудили за мошенничество с ценными бумагами. С самых высот финансового мира Белфорду приходиться опуститься на самое дно, он борется с алкоголизмом и наркотической зависимостью, но после тюремного заключения бывший брокер переосмысливает свою жизнь, начинает читать лекции и выпускает книгу.");
                        break;
                    case 2:
                        controller.updet("D:\\IdeaProjects\\untitled\\src\\Task15\\4.jpg", "Дата показа 15.12.2023","Американское семейство отправляется из Чикаго в Европу, но в спешке сборов бестолковые родители забывают дома… одного из своих детей. Юное создание, однако, не теряется и демонстрирует чудеса изобретательности. И когда в дом залезают грабители, им приходится не раз пожалеть о встрече с милым крошкой.");
                        break;
                    case 3:
                        controller.updet("D:\\IdeaProjects\\untitled\\src\\Task15\\5.jpg", "Дата показа 16.12.2023", "Кобб — талантливый вор, лучший из лучших в опасном искусстве извлечения: он крадет ценные секреты из глубин подсознания во время сна, когда человеческий разум наиболее уязвим. Редкие способности Кобба сделали его ценным игроком в привычном к предательству мире промышленного шпионажа, но они же превратили его в извечного беглеца и лишили всего, что он когда-либо любил.");
                        break;
                    case 4:
                        controller.updet("D:\\IdeaProjects\\untitled\\src\\Task15\\1.png", "Дата показа 17.12.2023", "Вскоре после отмщения за смерть жены и сына, Макс Рокатански покинул ряды «Основного силового патруля» и уехал в глушь, где скитается в одиночестве, пока мир медленно падает впоследствии нефтяного кризиса и глобальной войны. Не имея ничего, кроме своей машины «Перехватчик», Максу предстоит научиться, как выжить в пост-апокалиптической пустоши и сражаться с жестокими, безжалостными воинами, которые населяют её.");
                        break;
                }
                click++;
                if (click == 5) {
                    click = 0;
                }
            }
        });
    }
}

Task15/MVCPatternDemoStudent.java

Task15/MVCPatternDemoStudent.java
package Task15;

public class MVCPatternDemoStudent {
    public static void main(String[] args){
        Student model = retriveStudentFromDa();
        StudentView view = new StudentView();
        StudentController controller = new StudentController(model, view);
        controller.updateView();
        controller.setStudentRollNo("01");
        System.out.println("--------------------------");
        controller.updateView();
    }
    private static Student retriveStudentFromDa() {
        Student student = new Student();
        student.setName("Николай");
        student.setRollNo("09");
        return student;
    }
}

Task15/Student.java

Task15/Student.java
package Task15;

public class Student {
    private String name;
    private  String rollNo;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getRollNo() {
        return rollNo;
    }

    public void setRollNo(String rollNo) {
        this.rollNo = rollNo;
    }
}

Task15/StudentController.java

Task15/StudentController.java
package Task15;

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

    public StudentController(Student model, StudentView view) {
        this.model = model;
        this.view = view;
    }
    public void setStudentName(String name){
        model.setName(name);
    }
    public String getStudentName(){
        return model.getName();
    }
    public void setStudentRollNo(String rollNo){
        model.setRollNo(rollNo);
    }
    public String getStudentRollNo(){
        return model.getRollNo();
    }
    public void updateView(){
        view.printStudentDetails(model.getName(), model.getRollNo());
    }
}

Task15/StudentView.java

Task15/StudentView.java
package Task15;

public class StudentView {
    public void printStudentDetails(String name, String rollNo){
        System.out.println("Name: " + name);
        System.out.println("RollNo: " + rollNo);
    }
}

Описание

В этом модуле используется 12 Java-файлов. Ключевые сущности: Employee, EmployeeController, EmployeeView, Movie, MovieController, MovieView.

tip

Для проверки практики сначала запускайте тестовый/демо-класс из папки задачи, затем расширяйте модель новыми кейсами.

Вывод

Task 15 — MVC паттерн документирует реальное решение из исходного кода.