Ayuda con MVC

Sáquenme de dudas, por ejemplo al hacer un programa con mvc, pues la vista envía los mensajes al controlador para que este a su vez envíe el mensaje al modelo, entonces en el modelo va la lógica de la aplicación, en el controlador es el puente entre la vista y el modelo, y ps el modelo sólo recibe las acciones hechas por el usuario y da las respuestas respectivas, mi pregunta es la seguiente:
Al realizar una aplicación de escritorio por ejemplo: un login, la persona escribe su usuario y contraseña respectiva, y este viaja al controlador el cuál pedirá al modelo si es correcta o no, pues donde redacto los mensajes que se le regresarán al usuario, por ejemplo contraseña incorrecta, lo redacto en el modelo, controlador o en la vista, me podrín explicar porfavor.

Otra consulta:
Al hacer las validaciones por ejemplo de números, creo en el modelo una clase validadora, el cuál lo llamo en el controlador?, o simplemente lo valido en el modelo, el cuál ps para el ejemplo del login, cuando ingrese la contraseña incorrecta desde el modelo con un método retorne un String con el mensaje.

Si fueran tan amables en responderme y si es con un ejemplo básico sería mejor, gracias.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Implementacion MVC

No pierdas el enfoque del MVC, separar responsabilidades y facilitar el mantenimiento. En una aplicación Swing puede implementarse como:

Modelo
----------------------
class Login {
private string pass;
private string user;

//geters y setters
}

class LoginResult{
boolean state;
String msg;

//getter setter
}

class LoginValidator {

public LoginResult validate(Login login){
//regla de negocio
}
}

Vista
-------------------------------------
interface LoginView {
public String getUser();

public String getPass();

public void printLoginResult(String msg);
}

class LoginViewPanel exteds JPanel implements LoginVIew {
//instanciar componentes gui
//agregar el controlador como escucha
public void addListener(Action Listener){
}
}

Controlador
-----------------------
class LoginController implements ActionListener {

public LoginController(LoginValidator validator, LoginVIew view){

}

//evento boton loguin
public void actionPerformer(Event event){
String user = view.getUser();
String pass = view.getPass();
Login login = new Login(user, pass);
LoginResult result = validator.validate(login);
if(result.getState() == failed){
view.printResult(result.getMessage());
}
}
}

Imagen de ezamudio

Mi interpretación

Como yo lo veo es así: en las tres partes hay lógica, pero la separación de funciones es importante.

  • Vista: Los componentes de la capa de vista, tienen lógica para presentar datos, y alguna forma abstracta de comunicarse con la capa de control, para pedir datos nuevos y avisar de cambios realizados a los datos.
  • Control: Los componentes de la capa de control son los que contienen la lógica de negocio; tienen una forma abstract de comunicarse con la capa de modelo, para manejar la persistencia de datos (hacer consultas, actualizaciones, etc). En algunos casos pueden tener una comunicación abstracta con la capa de vista, pero es raro.
  • Modelo: Los componentes de esta capa se encargan de la persistencia de datos. También aquí por lo general se encuentran los objetos que representan datos (value objects, o como quieras llamarles). Por lo general existen de manera independiente, es decir no necesitan comunicarse con las demás capas, pero si lo llegan a requerir, debe ser de forma abstracta (con interfaces).

¿Cuál es la finalidad de esto? Pues es sencillo: cuando escribas tus componentes de la capa de modelo, enfócate en lo que tienen que hacer, pero de manera abstracta: almacenar los datos, realizar algunas consultas, etc.

Cuando escribas tus controladores, ahí pones la lógica de negocio, y seguramente van a necesitar usar los componentes de la capa de modelo, pero sin preocuparse de cómo se almacenan los datos. Aquí sirve por ejemplo preguntarse si el componente puede ser utilizado tanto en una aplicación web como en una aplicación de escritorio, o en un servicio REST/SOAP-RPC/HTTP-RPC/etc.

Cuando escribas tus componentes de vista, debes de enfocarte únicamente en la presentación de datos y en poder avisarle a la capa de control de los cambios realizados a los datos, y de obtener datos nuevos que presentar. Aquí es donde manejas los eventos del usuario, etc.

¿Cómo vas a manejar la comunicación entre capas? Utiliza interfaces. Esto te permite cambiar una implementación por otra: Puedes cambiar los modelos que utilizan una base de datos relacional por modelos que usan persistencia NoSQL o lo que sea. De igual manera, puedes reutilizar los controladores en una aplicación web y en una aplicación de escritorio. Si hay comunicación de los controladores hacia la vista, es por interfaces, de modo que no hay acoplamiento con una vista específica (por ejemplo web).