Model – View – Controller

Definição

Não existe uma definição totalmente aceite. Todavia, citando a wikipédia:

Model–view–controller is an architectural pattern commonly used for developing user interfaces that divides an application into three interconnected parts. This is done to separate internal representations of information from the ways information is presented to and accepted from the user. The MVC design pattern decouples these major components allowing for efficient code reuse and parallel development.

Este padrão é composto por três componentes: model, view, controller. O controller faz a ligação entre o model e a view, a comunicação entre o model e a view é gerida pelo controller. Assim, este padrão divide a maneira como a informação é mostrada, da maneira como é manipulada, isolando as regras do negócio da lógica da apresentação.

  • View: Apresentar o output. Podemos pensar como sendo a user interface. Exemplos: CSS, WPF, Swing, HTML.
  • Model: Faz a gestão da informação e a lógica de negócio. Guarda e manipula a informação através de requests do controller. Exemplos: MSSQL, MySQL, PostgreSQL, CouchDB, MongoDB.
  • Controller: É o intermediário entre a view e o model. Recebe a informação através da view e passa o request para o modelExemplos: .NET, NodeJS, Java, PHP, Python.

Esta padrão também permite:

  • o uso de múltiplas views;
  • que o controller valide a informação obtida pela view;
  • quem em algumas frameworks model actualize a view;
  • que a informação obtida pelo controller seja obtida de várias fontes, como por exemplo um web request.

As vantagens deste padrão arquitectural são, principalmente:

  • a alteração da user interface (view) ou do controller sem ter a necessidade de alterar o modelo;
  • aumento de produtividade;
  • facilidade na documentação;
  • complexidade do código, assim como a sua reutilização;
  • uniformização da estrutura da aplicação.
public class Person {
    private String name;
    private int age;

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

    public void setAge(int age){
        this.age = age;
    }

    public String getName(){
        return name;
    }

    public int getAge(){
        return age;
    }
}
public class View {
    public void printPerson(String name, int age){
        System.out.println("Name: " + name);
        System.out.println("Age: " + age);
    }
}
public class Controller {
    private Person model;
    private View view;

    public Controller(Person model, View view){
        this.model = model;
        this.view = view;
    }

    public String getPersonName(){
        return model.getName();
    }

    public int getPersonAge(){
        return model.getAge();
    }

    public void setPersonName(String name){
        model.setName(name);
    }

    public void setPersonAge(int age){
        model.setAge(age);
    }

    public void display(){
        view.printPerson(model.getName(), model.getAge());
    }
}
public class Demo {
    public static void main(String[] args) {
        Person model = sourceInformation();

        Controller controller = new Controller(model, new View());
        controller.display();
        controller.setPersonName("Santos");
        controller.display();
    }

    private static Person sourceInformation(){
        Person p = new Person();
        p.setName("André");
        p.setAge(28);
        return p;
    }
}
OUTPUT:

Name: André
Age: 28
Name: Santos
Age: 28