Hướng dẫn Java Design Pattern – MVC

1. MVC Pattern là gì?

Model – View – Controller (MVC) Pattern là một mẫu thiết kế nhằm mục tiêu chia tách phần giao diện và code để dễ quản lý, phát triển và bảo trì.

MVC Pattern  là một dạng Architectural Design Pattern được áp dụng để xử lý các vấn đề liên quan đến kiến trúc ứng dụng.

MVC Pattern tuân thủ nguyên tắc thiết kế Separation of Concern, giúp phân tách logic của các tầng (layer) khác nhau trong một chương trình thành các đơn vị độc lập.

MVC chia ứng dụng phần mềm ra làm 3 phần có tương tác với nhau: Model (dữ liệu), View (giao diện), Controller (điều khiển tương tác giữa Model và View).

2. Cài đặt MVC Pattern như thế nào?

Các thành phần tham gia MVC Pattern:

  • Model : là nơi lưu trữ dữ liệu người dùng, chứa business logic. Nó cho phép truy xuất dữ liệu để hiển thị hoặc thu thập dữ liệu. Model là cầu nối giữa thành phần View và Controller. Mục đích quan trọng nhất của nó là kết nối cơ sở dữ liệu (database), xử lý dữ liệu và chuẩn bị dữ liệu để chuyển đến các thành phần khác.
  • View : là giao diện của hệ thống, nơi dữ liệu (Model) được hiển thị, nhận tương tác trực tiếp với người dùng. Trong ứng dụng web, View là một phần của hệ thống, nơi mà các mã HTML được sinh ra và hiển thị. Một vấn đề quan trọng là View không được lấy dữ liệu trực tiếp từ Controller mà phải thông qua Model.
  • Controller : nhận yêu cầu, dữ liệu từ người dùng, sau đó cập nhật sang Model và cuối cùng trả kết quả lại View để show kết quả cho người dùng. Controller không chứa bất kỳ logic nghiệp vụ nào.

2.1. Ví dụ sử dụng MVC Pattern

Giả sử chúng ta có một ứng dụng quản lý cho phép hiển thị thông tin chi tiết, chỉnh sửa thông tin của Sinh viên. Chương trình của chúng ta như sau:

StudentModel.java

package com.maixuanviet.patterns.other.mvc;
 
import java.time.LocalDate;
 
import lombok.AllArgsConstructor;
import lombok.Data;
 
@Data
@AllArgsConstructor
public class StudentModel {
 
    private Integer id;
    private String name;
    private LocalDate updatedDate;
 
    public boolean save() {
        if (name.length() <= 10) {
            this.updatedDate = LocalDate.now();
            return true;
        }
        return false;
    }
}
&#91;/code&#93;
<!-- /wp:shortcode -->

<!-- wp:paragraph -->
<p>StudentView.java</p>
<!-- /wp:paragraph -->

<!-- wp:shortcode -->

package com.maixuanviet.patterns.other.mvc;
 
import java.time.format.DateTimeFormatter;
 
public class StudentView {
     
    public void showHomePage() {
        System.out.println("Home page of Student");
    }
 
    public void showDetailPage(StudentModel student) {
        System.out.println("Student: ");
        System.out.println("+ Id: " + student.getId());
        System.out.println("+ Name: " + student.getName());
        System.out.println("+ Updated date: " + 
                student.getUpdatedDate().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")));
        System.out.println("---------------------------");
    }
     
    public void showUpdatedPage(StudentModel student) {
        System.out.println("Saved successfully");
        showDetailPage(student);
    }
     
    public void showErrorMessage() {
        System.out.println("ERROR!!!");
    }
}

StudentController.java

package com.maixuanviet.patterns.other.mvc;
 
import java.time.LocalDate;
 
public class StudentController {
 
    private StudentModel student;
    private StudentView view;
 
    public StudentController() {
        student = new StudentModel(1, "No Name", LocalDate.now());
        view = new StudentView();
    }
 
    public void showDetail() {
        view.showDetailPage(student);
    }
 
    public void changeName(String newName) {
        student.setName(newName);
    }
 
    public void save() {
        boolean isSuccess = student.save();
        if (isSuccess) {
            view.showUpdatedPage(student);
        } else {
            view.showErrorMessage();
        }
    }
}

MVCPatternExample.java

package com.maixuanviet.patterns.other.mvc;
 
public class MVCPatternExample {
 
    public static void main(String[] args) {
        StudentController controller = new StudentController();
        controller.showDetail();
 
        controller.changeName("maixuanviet");
        controller.save();
 
        controller.changeName("Java Design Pattern – MVC");
        controller.save();
    }
}

Output của chương trình:

Student: 
+ Id: 1
+ Name: No Name
+ Updated date: 17/02/2019
---------------------------
Saved successfully
Student: 
+ Id: 1
+ Name: maixuanviet
+ Updated date: 17/02/2019
---------------------------
ERROR!!!

Trong ví dụ trên, chúng ta thấy:

  • StudentModel : đóng vai trò là một Model, chứa thông tin của sinh viên (id, name) và logic xử lý lưu thông tin sinh viên (save).
  • StudentView : đóng vai trò là một View, dùng để show thông tin của sinh viên (Model).
  • StudentController : đóng vai trò là một Controller, nhận yêu cầu từ User (showDetail, changeName, save), cập nhật thông tin vào Model (setName), chứa flow điều khiển gọi xử lý lưu thông tin từ Model (save), xác định View nào sẽ được hiển thị (showDetailPage, showUpdatedPage, showErrorMessage).
  • MVCPatternExample : đóng vai trò là một User, chỉ có thể thao tác với Controller để xem thông tin Model từ View.

3. Lợi ích của MVC Pattern là gì?

  • MVC cho phép phát triển ứng dụng nhanh chóng. Chúng ta có thể tạo một Model trước và chuyển thông tin này cho nhóm phát triển giao diện người dùng. Họ có thể bắt đầu implement phần View song song với đội Backend implement Controller và logic để phát triển nhanh hơn.
  • Giảm độ phức tạp của code.
  • Tăng khả năng tái sử dụng.
  • Giảm bớt sự phụ thuộc trong code, dễ bảo trì, dễ nâng cấp hơn.