Olá… já escrevi o código daquilo que entendi até o momento.
:arrow: CAMADA APLICAÇÃO
// Esta classe principal está na Camada de Aplicação.
public class AgendaIngrid {
public static void main(String args[]) {
AgendaConfig conf = new AgendaConfig();
conf.config();
AgendaPresenter presenter = conf.getPresenter();
presenter.start();
}
}
// Esta classe de configuração está na Camada de Aplicação.
public class AgendaConfig {
private AgendaPresenter presenter;
public void config() {
AgendaViewA view = new AgendaViewC();
AgendaModeloA model = new AgendaModelo();
this.presenter = new AgendaPresenter(model, view);
}
public AgendaPresenter getPresenter() {
return this.presenter;
}
}
:arrow: CAMADA FUNCIONAL: ANDAR CLIENTE
// Esta classe é um dos 'n' inputs do Andar Cliente e é uma das 'n' possíveis telas que serão exibidas ao usuário.
// Também é um dos 'n' outputs deste andar e fará input em um dos 'n' inputs no andar Apresentação.
import javax.swing.*;
import java.awt.event.*;
public class AgendaViewC extends JFrame implements AgendaViewA {
private AgendaPresenter ap;
private JTextField nome, eMail, telefone;
private JButton bCadastrar;
public AgendaViewC() {
JPanel p = new JPanel();
p.add(new JLabel("Nome:"));
p.add(nome = new JTextField(10));
p.add(new JLabel(" - Telefone:"));
p.add(telefone = new JTextField(10));
p.add(new JLabel(" - E-Mail:"));
p.add(eMail = new JTextField(10));
p.add(bCadastrar = new JButton("Cadastrar Pessoa >>"));
bCadastrar.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent ae) {
ap.cadastrarAgenda();
}
});
add(p);
setTitle("Agenda Ingrid vs1.1");
setSize(720,70);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public void setPessoa(Pessoa p) {
this.nome.setText(p.getNome());
this.telefone.setText(p.getTelefone());
this.eMail.setText(p.getEMail());
}
public Pessoa getPessoa() {
Pessoa p = new Pessoa();
p.setNome(this.nome.getText());
p.setTelefone(this.telefone.getText());
p.setEMail(this.eMail.getText());
return p;
}
public void exibir() {
this.setVisible(true);
}
public void setPresenter(AgendaPresenter ap) {
this.ap = ap;
}
}
:arrow: CAMADA FUNCIONAL: ANDAR APRESENTAÇÃO
// Esta interface é um dos 'n' inputs do Andar Apresentação.
// E neste caso especifico é uma das 'n' views ( V do MVP ) que estão presentes neste mesmo andar.
interface AgendaViewA {
public void exibir();
public Pessoa getPessoa();
public void setPessoa(Pessoa p);
public void setPresenter(AgendaPresenter ap);
}
// Esta classe é um dos 'n' presenters ( P do MVP ) que estão presentes no Andar Apresentação.
public class AgendaPresenter {
private AgendaModeloA m;
private AgendaViewA v;
public AgendaPresenter(AgendaModeloA model, AgendaViewA view) {
this.m = model;
this.v = view;
m.addModeloListener(
new AgendaModeloListener() {
public void onAtualizar(AgendaModeloEvent me) {
v.setPessoa(me.getPessoa());
}
});
}
public void cadastrarAgenda() {
m.cadastrar(v.getPessoa());
}
public void start(){
v.setPresenter(this);
v.exibir();
}
}
// Esta interface é um dos 'n' outputs do Andar Apresentação.
// E neste caso especifico é um dos 'n' models ( M do MVP ) que estão presentes neste mesmo andar.
interface AgendaModeloA {
public void cadastrar(Pessoa p);
public void addModeloListener(AgendaModeloListener l);
}
// Esta classe é uma implementação de uma das 'n' interfaces do M do MVP ( Neste caso específico, de AgendaModeloA ).
// Também é um dos 'n' outputs deste andar e fará input em um dos 'n' inputs no andar Domínio.
import java.util.*;
import java.util.concurrent.*;
public class AgendaModelo implements AgendaModeloA {
private Pessoa p;
private final Set<AgendaModeloListener> modeloListeners = new CopyOnWriteArraySet<AgendaModeloListener>();
public void cadastrar(Pessoa p) {
this.p = p;
// Acessa a camada inferior de domínio...
this.fireOnAtualizar();
}
public void addModeloListener(AgendaModeloListener ml) {
this.modeloListeners.add(ml);
}
public void removeModeloListener(AgendaModeloListener ml) {
this.modeloListeners.remove(ml);
}
private void fireOnAtualizar() {
AgendaModeloEvent evento = new AgendaModeloEvent(p);
for (AgendaModeloListener ml : modeloListeners) {
ml.onAtualizar(evento);
}
}
}
public interface AgendaModeloListener {
void onAtualizar(AgendaModeloEvent e);
}
public class AgendaModeloEvent {
private Pessoa p;
public AgendaModeloEvent(Pessoa p) {
this.p = p;
}
public Pessoa getPessoa(){
return this.p;
}
}
public class Pessoa {
private String nome, eMail, telefone;
public Pessoa() {
this.nome="N/C";
this.eMail="N/C";
this.telefone="N/C";
}
public void setNome(String nome) {
this.nome = nome;
}
public String getNome() {
return this.nome;
}
public void setEMail(String eMail) {
this.eMail = eMail;
}
public String getEMail() {
return this.eMail;
}
public void setTelefone(String telefone) {
this.telefone = telefone;
}
public String getTelefone() {
return this.telefone;
}
}
Vejam, eu tenho uma dúvida recorrente. Sei que algumas das pessoas que estão ajudando vão ficar muito nervosas com a minha pergunta mas preciso fazê-la:
O certo seria as ‘n’ classes do andar Cliente conhecer as classes de visão do andar Apresentação e não os seus presenters diferentemente de como está escrito no código acima?
Como exemplo, só reparar na classe AgendaViewC. Ela está trabalhando com o presenter da Apresentação. Isso é completamente errado não? :? Estou ficando maluca !!
O correto será a interface AgendaViewA ser implementada no andar Apresentação e aí sim o andar Cliente fará chamadas aos métodos desse objeto implementado lá na Apresentação certo?
Porque aí Cliente estaria falando com a visão do andar inferior e não com o miolo dele ( o presenter ). Tem que falar com o V, não com o P, no caso de uma implementação de MVP ocorrer dentro do andar Apresentação. Certa eu?
Estou tendo muita dificuldade em entender isso: as camadas devem ser isoladas não? É errado um andar superior implementar uma interface da camada inferior a não ser uma visão deste inferior?
Aí me desculpem muitooo pelo desconforto das minhas perguntas… eu sou muito leiga em arquitetura. Tenham paciência comigo, não desistam…
Obrigada, ficarei aguardando… Até mais.