Java Pattern MVC Model View Controller Design Pattern

  • Slides: 28
Download presentation
Java Pattern MVC Model – View - Controller

Java Pattern MVC Model – View - Controller

Design Pattern – da Wikipedia Un design pattern può essere definito "una soluzione progettuale

Design Pattern – da Wikipedia Un design pattern può essere definito "una soluzione progettuale generale a un problema ricorrente". Il termine fu inizialmente introdotto in architettura in un celebre saggio di Christopher Alexander; in seguito, proprio l'opera di Alexander ispirò la nascita di un settore dell'ingegneria del software dedicato all'applicazione del concetto di design pattern alle architetture software, soprattutto object-oriented. Oggi, l'espressione design pattern viene usata principalmente con riferimento a questo particolare contesto.

MVC – da Wikipedia Model-View-Controller (MVC, talvolta tradotto in italiano Modello-Vista-Controllore) è il nome

MVC – da Wikipedia Model-View-Controller (MVC, talvolta tradotto in italiano Modello-Vista-Controllore) è il nome di un design pattern fondamentale nello sviluppo di interfacce grafiche di sistemi software object-oriented. Originariamente impiegato dal linguaggio Smalltalk, il pattern è stato esplicitamente o implicitamente sposato da mumerose tecnologie moderne, come framework basati su Java (Swing, JSF e Struts), su Objective C o su. NET. A causa della crescente diffusione di tecnologie basate su MVC nel contesto di framework o piattaforma middleware per applicazioni Web, l'espressione framework MVC o sistema MVC sta entrando nell'uso anche per indicare specificatamente questa categoria di sistemi (che comprende per esempio Struts, Spring e Tapestry).

MVC – da Wikipedia Model è il cuore dell'applicazione. Definisce i dati e le

MVC – da Wikipedia Model è il cuore dell'applicazione. Definisce i dati e le operazioni che possono essere eseguiti su essi. Fornisce delle funzioni per l'accesso e l'aggiornamento. Può inoltre avere la responsabilità di notificare ai componenti della View eventuali aggiornamenti verificatisi in seguito a richieste del Controller, al fine di permettere alle View di presentare agli occhi degli utenti dati sempre aggiornati. View è l'interfaccia (grafica, GUI, ma anche no) con cui l'utente interagisce. Il controller ha la responsabilità di trasformare le interazioni dell'utente della View in azioni eseguite dal Model. Ma il Controller non rappresenta un semplice "ponte" tra View e Model. Realizzando la mappatura tra input dell'utente e processi eseguiti dal Model e selezionando la schermate della View richieste, il Controller implementa la logica di controllo dell'applicazione.

Pattern MVC Model View Controller

Pattern MVC Model View Controller

MVC – Model public class Model { int x[] = new int[10]; // lista

MVC – Model public class Model { int x[] = new int[10]; // lista degli elementi int current=0; // elemento attivo int delta=5; // di quanto cambia la x ogni volta public Model() { for (int e = 0; e < 10; e++) { x[e] = 100; // posizione iniziale } } void increase. Current() {x[current]+=delta; } void decrease. Current() {x[current]-=delta; } void set. Current(int c) {current=c; } int get. Current() {return current; } int[] get. X() {return x; } }

MVC – View 1 public class View 1 extends JPanel { Model model=null; public

MVC – View 1 public class View 1 extends JPanel { Model model=null; public View 1(Model m) { model=m; } public void paint. Component(Graphics g) { Dimension d=this. get. Size(); g. set. Color(Color. YELLOW); g. fill. Rect(0, 0, d. width, d. height); g. set. Color(Color. BLUE); int [] x=model. get. X(); for (int i=0; i<x. length; i++) { int y=10+i*27; g. fill. Oval(x[i]-3, y-3, 6, 6); } } }

MVC – View 2 – parte 1 public class View 2 extends JPanel {

MVC – View 2 – parte 1 public class View 2 extends JPanel { Model model=null; JLabel[] s=null; public View 2(Model m) { model=m; s=new JLabel[10]; this. set. Layout(new Grid. Layout(10, 1)); for (int i=0; i<10; i++) { s[i]=new JLabel(); this. add(s[i]); } }

MVC – View 2 – parte 2 public void paint. Component(Graphics g) { int

MVC – View 2 – parte 2 public void paint. Component(Graphics g) { int [] x=model. get. X(); int selected=model. get. Current(); for (int i=0; i<x. length; i++) { String h="<HTML><CENTER><B>"; if (i==selected) h=h+"<FONT COLOR="RED">"; s[i]. set. Text(h+x[i]); } Dimension d=this. get. Size(); g. set. Color(Color. ORANGE); g. fill. Rect(0, 0, d. width, d. height); } }

MVC – Controller – parte 2 public class Controller implements Key. Listener { Model

MVC – Controller – parte 2 public class Controller implements Key. Listener { Model model; JFrame f; public Controller(Model m, JFrame f) { model=m; this. f=f; } public void key. Pressed(Key. Event e) { } public void key. Released(Key. Event e) { } public void key. Typed(Key. Event e) { char c=e. get. Key. Char(); switch (c) { case '+' : model. increase. Current(); break; case '-' : model. decrease. Current(); break; default: System. out. println(c); if ('0'<=c && c<='9') model. set. Current(c-'0'); else Toolkit. get. Default. Toolkit(). beep(); } f. repaint(); } }

MVC – finestra –a parte 1 public class Finestra extends JFrame { JPanel content.

MVC – finestra –a parte 1 public class Finestra extends JFrame { JPanel content. Pane; View 1 view 1 = null; View 2 view 2 = null; //Overridden so we can exit when window is closed protected void process. Window. Event(Window. Event e) { super. process. Window. Event(e); if (e. get. ID() == Window. Event. WINDOW_CLOSING) { System. exit(0); } } C’e’ poi la solita classe che contiene il main e che crea la finestra

MVC – finestra – parte 2 public Finestra() { enable. Events(AWTEvent. WINDOW_EVENT_MASK); Model m=new

MVC – finestra – parte 2 public Finestra() { enable. Events(AWTEvent. WINDOW_EVENT_MASK); Model m=new Model(); View 1 view 1=new View 1(m); View 2 view 2=new View 2(m); this. add. Key. Listener(new Controller(m, this)); content. Pane = (JPanel) this. get. Content. Pane(); content. Pane. set. Layout(new Grid. Layout(1, 2)); this. set. Size(new Dimension(400, 300)); this. set. Title("Frame Title"); content. Pane. add(view 1, null); content. Pane. add(view 2, null); } }

Java Pattern Singleton Come fare perchè una classe possa avere solo una unica istanza

Java Pattern Singleton Come fare perchè una classe possa avere solo una unica istanza condivisa?

Singleton - Esempio – 1/2 class Arbitro { static Arbitro instance= null; private Arbitro()

Singleton - Esempio – 1/2 class Arbitro { static Arbitro instance= null; private Arbitro() { String s = ""; } public static Arbitro get. Arbitro() { if (instance ==null) instance=new Arbitro(); return instance; } public void fischia() { //. . . } }

Singleton - Esempio – 2/2 package my. Package; public class Simple { public static

Singleton - Esempio – 2/2 package my. Package; public class Simple { public static void main(String a[]) { new Simple(); } Simple() { //Arbitro a=new Arbitro(); Arbitro b=Arbitro. get. Arbitro(); Arbitro c=Arbitro. get. Arbitro(); System. out. println(b==c); } }

Java Serialization

Java Serialization

Il problema della persistenza Persistenza dei dati quando l’applicazione non è running: salvataggio della

Il problema della persistenza Persistenza dei dati quando l’applicazione non è running: salvataggio della struttura interna di un oggetto. E’ un problema ricorsivo! Serializzazione: trasformazione di oggetti in “stream di dati” (seriali). Il JDK prevede delle API per la serializzazione, e la maggior parte delle sue classi sono serializzabili.

persistenza selettiva Le variabili dichiarate transient non vengono serializzate.

persistenza selettiva Le variabili dichiarate transient non vengono serializzate.

Supporto di JDK alla persistenza Object. Output. Stream: converte oggetti dalla rappresentazione in memoria

Supporto di JDK alla persistenza Object. Output. Stream: converte oggetti dalla rappresentazione in memoria a quella serializzata. Object. Input. Stream: converte oggetti dalla rappresentazione serializzata a quella in memoria. Serializable: interfaccia senza metodi che marca una classe come seralizzabile. Externalizable: interfaccia con metodi (sottoclasse di Serializable) che fornisce maggior controllo sul processo di serializzazione. Object. Input. Validation: interfaccia per verificare la corretta decodifica di un oggetto.

Principali Metodi di Object. Outputstream Object. Output. Stream(Output. Stream) costruttore write. Object(Object) serializza Object

Principali Metodi di Object. Outputstream Object. Output. Stream(Output. Stream) costruttore write. Object(Object) serializza Object close() flush() reset() write. Int(int) write. Float(float) write. Double(double)

Principali Metodi di Object. Inputstream Object. Input. Stream(Input. Stream) costruttore Object read. Object() deserializza

Principali Metodi di Object. Inputstream Object. Input. Stream(Input. Stream) costruttore Object read. Object() deserializza Object available() dice quanti bytes ci sono da leggere int read. Int() float write. Float() double write. Double()

Esempio –Writer 1/2 package serial. Demo; import java. io. *; import java. util. *;

Esempio –Writer 1/2 package serial. Demo; import java. io. *; import java. util. *; public class Writer { Hash. Map hm=new Hash. Map(); public Writer() { System. out. println("WRITER-------------"); for (int k=1; k<=10; k+=2) { String key=new String("a"+k); Integer ik=new Integer(k); hm. put(key, ik); } System. out. println(hm. size()); Iterator i=hm. key. Set(). iterator(); while (i. has. Next()) { Object o=i. next(); System. out. println(o. to. String()+"#"+ hm. get(o). to. String()); }

Esempio –Writer 2/2 File. Output. Stream ofs=null; Object. Output. Stream oos=null; try { ofs=new

Esempio –Writer 2/2 File. Output. Stream ofs=null; Object. Output. Stream oos=null; try { ofs=new File. Output. Stream("serialized. Stream. txt"); oos=new Object. Output. Stream(ofs); oos. write. Object(hm); } catch (IOException ex) { ex. print. Stack. Trace(); } } //----------------------public static void main(String[] args) { Writer writer = new Writer(); } }

Esempio –Reader 1/2 package serial. Demo; import java. io. *; import java. util. *;

Esempio –Reader 1/2 package serial. Demo; import java. io. *; import java. util. *; public class Reader { Hash. Map hm=null; //---------------------public static void main(String[] args) { Reader reader = new Reader(); }

Esempio –Reader 2/2 public Reader() { System. out. println("READER -------------"); File. Input. Stream ofs=null;

Esempio –Reader 2/2 public Reader() { System. out. println("READER -------------"); File. Input. Stream ofs=null; Object. Input. Stream oos=null; try { ofs=new File. Input. Stream("serialiazid. Stream. txt"); oos=new Object. Input. Stream(ofs); hm=(Hash. Map)oos. read. Object(); } catch (Class. Not. Found. Exception ex) { ex. print. Stack. Trace(); }catch (IOException ex) { ex. print. Stack. Trace(); } System. out. println(hm. size()); Iterator i=hm. key. Set(). iterator(); while (i. has. Next()) { Object o=i. next(); System. out. println(o. to. String()+" #“ +hm. get(o). to. String()); } }

Java Ripasso

Java Ripasso

Polimorfismo – ripasso abstract class OP { int f(int a, int b); } class

Polimorfismo – ripasso abstract class OP { int f(int a, int b); } class Somma extends OP { int f(int a, int b){ return a+b; } } class Sottrazione extends OP { int f(int a, int b){ return a-b; } }

Polimorfismo - ripasso class Test { public static void main(String[] a) { new Test;

Polimorfismo - ripasso class Test { public static void main(String[] a) { new Test; } public Test() { OP o; . . . if (i!=0) o=new Somma(); else o=new Sottrazione(); . . . System. out. println(o. f(3, 2)); } } Qual’è l’output ?