Exemplo muito simplificado de um sistema em produção usando pattern MVCP - nada disso é ideia minha
/* Ok, essa é a nossa classe para representar Noticias. Bem simples. */
class News implements INews{
private String message;
public News(String message){
this.message = message;
new Throwable().printStackTrace();
}
public String getMessage(){ return message; }
}
/* INews talvez não tenha muito sentido agora */
interface INews{
String getMessage();
}
/* Esta factory seria responsavel por continuar o trabalho de buscar a(s) noticia(s) do Banco de dados */
class INewsFactory{
public static INews create(){
INews n = new News("Este eh mais um exemplo confuso");
return n;
}
}
/* Um controller "burro" - limei a parte que salva os dados */
class MyController{
public INews loadNews(){
return INewsFactory.create();
}
}
/* O Presenter: até onde eu vi é uma 'camada' de apresentação, a promessa é que a View se tornaria extremamente simples. */
class MyPresenter {
private IMyView view;
private MyController controller;
public MyPresenter(){
controller = new MyController();
}
/* Tambem concordo que esta parte tambem poderia estar no construtor... */
public void setView(IMyView view){
this.view = view;
}
/* Ideia: quando a minha view carregar, este método será executado*/
public void onViewInitialized(){
view.setNews(controller.loadNews()); /* carrego a noticia*/
view.list(); /* mostro a noticia */
}
}
/* Outra Interface que agora parece não fazer muito sentido... */
interface WebPage{
void pageLoad();
}
/* No futuro sera refatorado para o uso de generics... */
interface IMyView{
void list();
void setNews(INews news);
}
/* Ah, a visão em si */
class MyView implements WebPage, IMyView{
private MyPresenter presenter;
private INews news;
/* toda a vez que a pagina carregar... */
public void pageLoad(){
presenter = new MyPresenter();
presenter.setView(this);
presenter.onViewInitialized();
}
/* recebo a noticia */
public void setNews(INews news){
this.news = news;
}
/* mostro a noticia */
public void list(){
System.out.println("message: " + news.getMessage());
}
}
/*Esta classe só simula tudo isso*/
public class Main{
public static void main (String[] x){
WebPage v = new MyView();
v.pageLoad();
}
}
Executando (lanço um throwable só para mostrar por onde passou desde o Main.main):
$ java Main
java.lang.Throwable
at News.<init>(Main.java:7)
at INewsFactory.create(Main.java:18)
at MyController.loadNews(Main.java:25)
at MyPresenter.onViewInitialized(Main.java:41)
at MyView.pageLoad(Main.java:62)
at Main.main(Main.java:77)
message: Este eh mais um exemplo confuso
A duvida: fora o que acontece na INewsFactory (que funciona a base de magian negra na vida real) este modelo tem
o presenter tem um controller e tem uma view (na verdade uma IView)
a view tem um presenter
Bad Smell ?