Wzorzec projektowy MVC

Wzorzec projektowy MVC to wzorzec architektury oprogramowania, który dzieli aplikację na trzy główne komponenty: model, widok i kontroler, co ułatwia zarządzanie i utrzymywanie bazy kodu. Pozwala także na ponowne wykorzystanie komponentów i promuje bardziej modułowe podejście do tworzenia oprogramowania.

Ważne tematy dotyczące wzorca projektowego MVC

Co to jest wzorzec projektowy MVC?

The Kontroler widoku modelu Wzorzec projektowy MVC określa, że ​​aplikacja składa się z modelu danych, informacji prezentacyjnych i informacji sterujących. Wzór wymaga, aby każdy z nich został rozdzielony na różne obiekty.

  • Wzorzec MVC dzieli problemy aplikacji na trzy odrębne komponenty, z których każdy odpowiada za określony aspekt funkcjonalności aplikacji.
  • To rozdzielenie problemów sprawia, że ​​aplikacja jest łatwiejsza w utrzymaniu i rozszerzaniu, ponieważ zmiany w jednym komponencie nie wymagają zmian w innych komponentach.

Składniki wzorca projektowego MVC

1. Modelka

Komponent Model we wzorcu projektowym MVC (Model-View-Controller) reprezentuje dane i logikę biznesową aplikacji. Odpowiada za zarządzanie danymi aplikacji, przetwarzanie reguł biznesowych i odpowiadanie na żądania informacji z innych komponentów, takich jak Widok i Kontroler.

2. Zobacz

Wyświetla dane z modelu użytkownikowi i wysyła dane wejściowe użytkownika do kontrolera. Jest pasywny i nie wchodzi w bezpośrednią interakcję z Modelem. Zamiast tego otrzymuje dane z Modelu i wysyła dane wejściowe użytkownika do Kontrolera w celu przetworzenia.

3. Kontroler

Kontroler pełni rolę pośrednika pomiędzy Modelem a Widokiem. Obsługuje dane wejściowe użytkownika i odpowiednio aktualizuje Model oraz aktualizuje Widok, aby odzwierciedlić zmiany w Modelu. Zawiera logikę aplikacji, taką jak walidacja danych wejściowych i transformacja danych.

Komunikacja pomiędzy komponentami

Poniższy przepływ komunikacji zapewnia, że ​​każdy komponent jest odpowiedzialny za określony aspekt funkcjonalności aplikacji, co prowadzi do łatwiejszej w utrzymaniu i skalowalnej architektury

  • Interakcja użytkownika z widokiem:
    • Użytkownik wchodzi w interakcję z widokiem, na przykład klikając przycisk lub wprowadzając tekst do formularza.
  • Widok otrzymuje dane wejściowe użytkownika:
    • Widok odbiera dane wejściowe użytkownika i przekazuje je do kontrolera.
  • Kontroler przetwarza dane wejściowe użytkownika:
    • Kontroler otrzymuje dane wejściowe użytkownika z widoku.
    • Interpretuje dane wejściowe, wykonuje wszelkie niezbędne operacje (takie jak aktualizacja modelu) i decyduje, jak zareagować.
  • Model aktualizacji kontrolera:
    • Kontroler aktualizuje Model w oparciu o dane wejściowe użytkownika lub logikę aplikacji.
  • Model powiadamia widok zmian:
    • Jeśli Model ulegnie zmianie, powiadomi Widok.
  • Wyświetl dane żądań z modelu:
    • Widok żąda danych od Modelu w celu aktualizacji jego wyświetlania.
  • Widok aktualizacji kontrolera:
    • Kontroler aktualizuje Widok w oparciu o zmiany w Modelu lub w odpowiedzi na dane wejściowe użytkownika.
  • Wyświetl rendery Zaktualizowany interfejs użytkownika:
    • Widok renderuje zaktualizowany interfejs użytkownika na podstawie zmian wprowadzonych przez kontrolera.

Przykład wzorca projektowego MVC

Poniżej znajduje się kod powyższego opisu problemu przy użyciu wzorca projektowego MVC:

Podzielmy kod na komponenty:

1. Model (klasa uczniów)

Reprezentuje dane (imię i nazwisko ucznia i numer rolki) oraz zapewnia metody dostępu i modyfikacji tych danych.

Jawa




class> Student {> > private> String rollNo;> > private> String name;> > public> String getRollNo() {> > return> rollNo;> > }> > public> void> setRollNo(String rollNo) {> > this> .rollNo = rollNo;> > }> > public> String getName() {> > return> name;> > }> > public> void> setName(String name) {> > this> .name = name;> > }> }>

2. Widok (klasa StudentView)

Reprezentuje sposób, w jaki dane (dane ucznia) powinny być wyświetlane użytkownikowi. Zawiera metodę ( printStudentDetails> ), aby wydrukować imię i nazwisko ucznia oraz numer rolki.

Jawa




class> StudentView {> > public> void> printStudentDetails(String studentName, String studentRollNo) {> > System.out.println(> 'Student:'> );> > System.out.println(> 'Name: '> + studentName);> > System.out.println(> 'Roll No: '> + studentRollNo);> > }> }>

3. Kontroler (klasa StudentController)

Działa jako pośrednik pomiędzy Modelem a Widokiem. Zawiera odniesienia do obiektów Model i View. Zapewnia metody aktualizacji modelu (np. setStudentName> , setStudentRollNo> ) i zaktualizować widok ( updateView> ).

Jawa




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());> > }> }>

Kompletny kod dla powyższego przykładu

Poniżej znajduje się pełny kod powyższego przykładu:

Jawa




class> Student {> > private> String rollNo;> > private> String name;> > public> String getRollNo() {> > return> rollNo;> > }> > public> void> setRollNo(String rollNo) {> > this> .rollNo = rollNo;> > }> > public> String getName() {> > return> name;> > }> > public> void> setName(String name) {> > this> .name = name;> > }> }> class> StudentView {> > public> void> printStudentDetails(String studentName, String studentRollNo) {> > System.out.println(> 'Student:'> );> > System.out.println(> 'Name: '> + studentName);> > System.out.println(> 'Roll No: '> + studentRollNo);> > }> }> 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());> > }> }> public> class> MVCPattern {> > public> static> void> main(String[] args) {> > Student model = retriveStudentFromDatabase();> > StudentView view => new> StudentView();> > StudentController controller => new> StudentController(model, view);> > controller.updateView();> > controller.setStudentName(> 'Vikram Sharma'> );> > controller.updateView();> > }> > private> static> Student retriveStudentFromDatabase() {> > Student student => new> Student();> > student.setName(> 'Lokesh Sharma'> );> > student.setRollNo(> '15UCS157'> );> > return> student;> > }> }>

Wyjście




Student:> Name: Lokesh Sharma> Roll No: 15UCS157> Student:> Name: Vikram Sharma> Roll No: 15UCS157>

Zalety wzorca projektowego MVC

  • Oddzielenie obaw: MVC oddziela różne aspekty aplikacji (dane, interfejs użytkownika i logika), dzięki czemu kod jest łatwiejszy do zrozumienia, utrzymania i modyfikowania.
  • Modułowość: Każdy komponent (Model, Widok, Kontroler) można opracować i przetestować osobno, co promuje możliwość ponownego użycia i skalowalność kodu.
  • Elastyczność: Ponieważ komponenty są niezależne, zmiany w jednym komponencie nie wpływają na inne, co pozwala na łatwiejsze aktualizacje i modyfikacje.
  • Rozwój równoległy: Wielu programistów może pracować jednocześnie nad różnymi komponentami, co przyspiesza proces programowania.
  • Możliwość ponownego wykorzystania kodu: Komponenty można ponownie wykorzystać w innych częściach aplikacji lub w różnych projektach, skracając czas i wysiłek programistyczny.

Wady wzorca projektowego MVC

  • Złożoność: Implementacja wzorca MVC może zwiększyć złożoność kodu, szczególnie w przypadku prostszych aplikacji, prowadząc do narzutów w rozwoju.
  • Krzywa uczenia się: Programiści muszą zrozumieć koncepcję MVC i sposób jej skutecznego wdrożenia, co może wymagać dodatkowego czasu i zasobów.
  • Nad głową: Komunikacja między komponentami (modelem, widokiem, kontrolerem) może prowadzić do narzutów, wpływających na wydajność aplikacji, szczególnie w środowiskach o ograniczonych zasobach.
  • Potencjał nadmiernej inżynierii: W niektórych przypadkach programiści mogą przesadzić z projektowaniem aplikacji, dodając niepotrzebne abstrakcje i warstwy, co prowadzi do rozdętego i trudnego w utrzymaniu kodu.
  • Zwiększona liczba plików: MVC może skutkować większą liczbą plików i klas w porównaniu z prostszymi architekturami, co może sprawić, że struktura projektu będzie bardziej złożona i trudniejsza w nawigacji.