Le design pattern Modèle-Vue-Contrôleur (MVC) est un design pattern qui propose une architecture logicielle, c’est-à-dire une organisation de toutes les classes d’une application.
Ensemble des classes qui représentent et manipulent les données. On peut parler de classes “métier”.
Ensemble des classes qui gèrent la présentation des données à l’utilisateur. La vue peut aussi être le point d’entrée des requêtes de l’utilisateur (saisie de texte, choix d’une action, etc.).
Ensemble des classes qui coordonnent le modèle et la vue pour répondre aux demandes de l’utilisateur.
public static void main( String[] args ) {
Book b1 = new Book("Default title");
System.out.println("Title : "+b1.getTitle());
Scanner scan = new Scanner(System.in);
System.out.println("Enter a book title :");
String title = scan.nextLine(); // Read user input
b1.setTitle(title);
System.out.println("New title : "+b1.getTitle());
}
public static void main( String[] args ) {
Book b1 = new Book("Default title");
Controller control = new Controller(b1);
View view = new View(b1,control);
view.showBook();
view.editBookTitle();
System.out.println("New title : "+b1.getTitle());
}
class Controller {
public Controller( Book book ) {
this.book = book;
}
public void modifyBookTitle( String title ) {
book.setTitle(title);
}
}
class View {
public View( Book book, Controller controller ) {
this.book = book;
this.controller = controller;
}
public void editBookTitle() {
Scanner scan = new Scanner(System.in);
System.out.println("Enter a book title :");
String title = scan.nextLine();
controller.modifyBookTitle(title);
}
public void showBook() {
System.out.println("Title : "+book.getTitle());
}
}
public static void main( String[] args ) {
Book b1 = new Book("Default title");b1.getTitle()
Controller control = new Controller(b1);
View view = new View(b1,control);
book.addObserver(view);
view.showBook();
view.editBookTitle();
}
class Controller {
public Controller( Book book ) {
this.book = book;
}
public void modifyBookTitle( String title ) {
book.setTitle(title);
}
}
class View implements BookObserver {
public View( Book book, Controller controller ) {
this.book = book;
this.controller = controller;
}
public void editBookTitle() {
Scanner scan = new Scanner(System.in);
System.out.println("Enter a book title :");
String title = scan.nextLine();
controller.modifyBookTitle(title);
}
public void showBook() {
System.out.println("Title : "+book.getTitle());
}
public void updateBookTitle( String title ) {
System.out.println("New title : "+title);
}
}
class Book {
public void setTitle( String title ) {
this.title = title;
notifyTitleChange(title);
}
}
MVC est à utiliser pour des applications conséquentes : c’est totalement inutile pour l’exemple minimaliste du livre.
MVC est intimement lié au design pattern Observer qui réalise de l’injection de dépendance.
Une classe MaClasse
dépend d’une classe Dependance
:
MaClasse
possède un attribut de type Dependance
.
MaClasse
est de type Dependance
.
MaClasse
dépend d’un objet de type Intermediaire
qui dépend d’un objet de type Dependance
.
MaClasse
appelle une méthode de Dependance
.
Principe :
Utiliser des interfaces pour ne pas dépendre des classes concrètes.
class Maclasse {
private Dependance attribut;
public MaClasse( Dependance dep ) {
attribut = dep;
}
}
public static void main(String[] args) {
Dependance dep = new Dependance();
MaClasse maClasse = new MaClasse(dep);
}
1. À l’instanciation.
class Maclasse {
private Dependance attribut;
public MaClasse( Dependance dep ) {
attribut = dep;
}
}
public static void main(String[] args) {
Dependance dep = new Dependance();
MaClasse maClasse = new MaClasse(dep);
}
Sans injection de dépendances.
class Maclasse {
private InterfaceDependance attribut;
public MaClasse( InterfaceDependance dep ) {
attribut = dep;
}
}
public static void main(String[] args) {
InterfaceDependance dep = new Dependance();
MaClasse maClasse = new MaClasse(dep);
}
Avec injection de dépendances.
2. Par modification.
class Maclasse {
private Dependance attribut;
public MaClasse() {}
public setDependance( Dependance dep ) {
attribut = dep;
}
}
public static void main(String[] args) {
Dependance dep = new Dependance();
MaClasse maClasse = new MaClasse();
maClasse.setDependance(dep);
}
Sans injection de dépendances.
class Maclasse {
private InterfaceDependance attribut;
public MaClasse() {}
public setDependance( InterfaceDependance dep ) {
attribut = dep;
}
}
public static void main(String[] args) {
InterfaceDependance dep = new Dependance();
MaClasse maClasse = new MaClasse();
maClasse.setDependance(dep);
}
Avec injection de dépendances.