Task 15 — MVC паттерн
Разделение модели, представления и контроллера.
Edit on GitHubЗадание
Разделение модели, представления и контроллера. Документация собрана по исходному коду этой практики.
Решение
Полный код решения по этой практике:
Исходные файлы решения
Task15/Employee.javaTask15/EmployeeController.javaTask15/EmployeeView.javaTask15/Movie.javaTask15/MovieController.javaTask15/MovieView.javaTask15/MVCPatternDemoEmployee.javaTask15/MVCPatternDemoMovie.javaTask15/MVCPatternDemoStudent.javaTask15/Student.javaTask15/StudentController.javaTask15/StudentView.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
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
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
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
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
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
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
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
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
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
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
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 паттерн документирует реальное решение из исходного кода.