Come noto nell'implementazione standard di MVC passiamo Controller e Modello alla vistaMVC: devo utilizzare Controller nella vista?
Ma sono un po 'in disaccordo con questa idea. Non voglio che la mia vista sia a conoscenza del controller e del modello (oh no forse a volte la vista ha bisogno del modello, ma sono sicuro che può vivere senza conoscenza del controller)
A mio parere Controller dovrebbe gestire Vista e Modello, e Model non ha bisogno di sapere su controller e view; la vista non ha bisogno di conoscere il controller (non escludo il modello perché alcune implementazioni di viste devono conoscere il modello per ascoltare i cambiamenti nel modello). Quindi la mia idea è che la vista non debba conoscere il controller.
1. Ecco un esempio:
public class MyView implements ButtonClickListener {
private Controller myController;
private Button myButton;
// I commented out the model because we dont need it now
// we are talking about using controller in the view
public MyView(Controller c/*, Model m*/) {
myController = c;
myButton = new Button(); // lets say that it is "register" button
myButton.setOnButtonClickListener(this);
}
public void setRegisterButtonText(String text) {
myButton.setText(text);
}
@Override
public void onClick() {
myController.tellToModelToDoSomething();
}
}
e regolatore:
public MyController implements Controller {
private Model model;
private View view;
public MyController(Model model) {
this.model = model;
this.view = new MyView(this);
}
public void tellToModelToDoSomething() {
model.doSomeActions();
}
}
2. E ora come faccio a vedere questa implementazione, senza passare il controllore:
La mia vista:
public class MyView {
private Button myButton;
public MyView() {
myButton = new Button();
}
public void setRegisterButtonText(String text) {
myButton.setText(text);
}
public void setOnRegisterButtonClick(final Command command) {
myButton.setOnButtonClickListener(new ButtonClickListener() {
@Override
public void onClick() {
command.execute();
}
});
}
}
interfaccia "Command":
public interface Command {
void execute(/*also can handle extra params*/);
}
e regolatore:
public MyController implements Controller {
private Model model;
private View view;
public MyController(Model model) {
this.model = model;
this.view = new MyView();
view.setOnRegisterButtonClick(command);
}
public void tellToModelToDoSomething() {
model.doSomeActions();
}
private Command command = new Command() {
public void execute() {
tellToModelToDoSomething();
}
};
}
Allora, perché penso che l'utilizzo del controller nella vista NON FA BENE:
Stiamo mixando controller e visualizzare le implementazioni, creando nuove dipendenze.
Inoltre, penso che la vista dovrebbe contenere solo VISTE e operazioni con essi (e usare il controller e alcuni dei suoi metodi già sembra logica).
Nella prima vista di esempio indica al controller cosa fare. Sei d'accordo? Sembra che la vista controlli il controller!
Nel secondo controller esempio controlla cosa fare e dice solo alla vista che cosa fare se qualche pulsante (solo vista sa cosa tasto sarà) cliccato
ho sempre usato il secondo schema, ma dopo aver letto un nuovo libro su mvc, che dice che dobbiamo passare il controller alla vista, sono un po 'confuso.
Potete per favore aiutarmi a capire perché mi sbaglio e mostrarmi qualche esempio?
Credo che controller e vista non interagiscano direttamente. Interagiscono anche se il modello. così il modello conosce sia il controller che la vista ma la vista e il controller non si conoscono. – gigadot
detto questo. MVC è disponibile in molte varianti e le reali implmenti sono diverse nella pratica. – gigadot
hai ragione .. e come pensi in questo esempio, quale implementazione è migliore? – pleerock