Java Programozás 11. Ea: MVC modell 20/1 B ITv: MAN 2018.03.02
MVC Model-View-Controller A modell-nézet-vezérlő a szoftvertervezésben használatos szerkezeti minta. Az MVC célja elválasztani az üzleti logikát a felhasználói felülettel kapcsolatos elgondolásoktól oly módon, hogy a fejlesztők minél könnyebben változtathassák meg az egyes részeket anélkül, hogy a többire hatással lennének. Az egyes részek feladata: Modell: képviseli az adatot és az üzleti logikát Nézet: a felhasználói felület elemei Vezérlő: biztosítja a nézet és a modell közötti kapcsolatot 20/2
MVC Vezérlő Modell Nézet 20/3
MVC alapú számológépecske Csak szorozni tud, mindig az aktuális eredményt szorozza össze egy beírható számmal. Van Reset funkciója 20/4
Számológépecske alapkód (még nem MVC) import javax.swing.*; import java.awt.event.*; public class Calc extends JFrame { JTextField adat, eredmeny; public Calc() { settitle("számológépecske"); setbounds(50,50, 300,160); JPanel dp = new JPanel(); dp.setlayout(null); getcontentpane().add(dp); JLabel jl1 = new JLabel("Szám:"); dp.add(jl1); jl1.setbounds(30,20, 50,20); 20/5 adat = new JTextField(); dp.add(adat); adat.setbounds(70,20, 60,20);
Számológépecske alapkód (még nem MVC) 20/6 JButton ba = new JButton(); ba.settext("szorzás"); dp.add(ba); ba.setbounds(150,18, 100,24); ba.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { String s = adat.gettext(); int a = Integer.parseInt(s); String x = eredmeny.gettext(); int b = Integer.parseInt(x); eredmeny.settext(""+a*b); ); JLabel jl2 = new JLabel("Eredmény:"); dp.add(jl2); jl2.setbounds(10,50, 70,20); eredmeny = new JTextField("1"); dp.add(eredmeny); eredmeny.setbounds(80,50, 200,20); eredmeny.seteditable(false);
Számológépecske alapkód (még nem MVC) 20/7 JButton br = new JButton(); br.settext("reset"); dp.add(br); br.setbounds(60,90, 80,24); br.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { adat.settext(""); eredmeny.settext("1"); ); JButton bc = new JButton(); bc.settext("bezár"); dp.add(bc); bc.setbounds(160,90, 80,24); bc.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { System.exit(0); );
Számológépecske alapkód (még nem MVC) public static void main(string[] args) { Calc ca = new Calc(); ca.setdefaultcloseoperation(jframe.exit_on_close); ca.setresizable(false); ca.setvisible(true); 20/8
Számológépecske MVC A modell A modellbe kerül a teljes üzleti logika, és a modell fogja tárolni az aktuális számítási eredményt, és az inicializálás/reset értéket: - adattag: inicializálási érték - adattag: aktuális számítási érték - konstruktor - getérték, setérték metódusok - reset metódus - számítást (szorzást) elvégző metódus 20/9
Számológépecske MVC A modell kódja public class CalcModel { private static final int INIT_VALUE = 1; private int value; public CalcModel() { value = INIT_VALUE; public int getvalue(){ return value; public void setvalue(int x) { value = x; public void reset() { value = INIT_VALUE; 20/10 public void operation(int a, int b) { value = a*b;
Számológépecske MVC A vezérlő A vezérlőbe kerülnek a kiolvasás, ellenőrzés, átalakítás, és a kommunikáció (M-V-C) műveletei: - szövegmező tartalom beolvasó metódus - szövegmező tartalom ellenőrző metódus - a modell számító metódusát hívó metódus - a modell számítási eredményét a GUI-ra kiíró metódus - Reset lebonyolító metódus - Üzeneteket megjelenítő metódus - String egésszé konvertálhatóságát ellenőrző metódus - Stringet egésszé konvertáló metódus - Lesz benne egy deklarált Modell példány! 20/11
Számológépecske MVC A vezérlő kódja import javax.swing.*; public class CalcController { private static String clm = "Calc program message"; CalcModel cm = new CalcModel(); 20/12 public boolean textfieldchecker(jtextfield jtf){ String s = readjtf(jtf); if (s.length() == 0) { showmd("nincs beírva adat!", 0); return false; else if (goodint(s)) return true; else { showmd("a beírt adat nem alakítható egész számmá!", 0); return false; public String readjtf(jtextfield a) { return a.gettext().tostring();
Számológépecske MVC A vezérlő kódja public void calc(jtextfield a, JTextField b) { int av = StoI(readJTF(a)); int bv = StoI(readJTF(b)); cm.operation(av, bv); int x = cm.getvalue(); b.settext(integer.tostring(x)); public void reset(jtextfield a, JTextField b) { cm.reset(); a.settext(""); int x = cm.getvalue(); b.settext(integer.tostring(x)); AController teremt kapcsolatot a View és a Modell között. 20/13
Számológépecske MVC A vezérlő kódja public boolean goodint(string s) { int x; try { x = Integer.parseInt(s); return true; catch (NumberFormatException e) {return false; public int StoI(String s){ return Integer.parseInt(s); public void showmd(string s, int i){ JOptionPane.showMessageDialog(null, s, clm, i); 20/14
Számológépecske MVC A View kódja public class CalcMVC extends JFrame { CalcController cc = new CalcController(); ba.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { if (cc.textfieldchecker(adat)) cc.calc(adat, eredmeny); ); br.addactionlistener(new ActionListener() { public void actionperformed(actionevent e) { cc.reset(adat, eredmeny); ); A View-ból nem látszik a Modell, minden művelet a Controller-en keresztül történik. 20/15
MVC 1. A grafikus felület vezérlői értelmezik a felhasználó parancsait 2. A parancsokat továbbítják a kontroller felé 3. A kontroller küldi az adatokat a modell felé, és utasítja azt az adatkezelésre 4. A modell a kiszámított adatokat visszaadja a kontrollernek 5. A kontroller utasítja a grafikus felületet az eredmények frissítésére 20/16
MVC Bonyolult MVC programok jellemzői: A kontrollert több osztályban valósítjuk meg Beolvasó, ellenőrző, konvertáló, kommunikáció A modellt is érdemes több részre bontani: Számítások, fájlkezelések, adatbázis-kezelés A grafikus felület is sok panelből állhat Pl: pdf fájl előállítása: A grafikus felületen megnyomjuk a nyomógombot A kontroller lekéri az adatokat a modelltől, és a kontroller állítja elő a pdf dokumentumot 20/17
MVC Az MVC modellnek megfelelően működnek a Java program grafikus elemei, pl: táblázatok, jelölőnégyzetek, számpörgettyűk. Adat kiolvasás Number Model Nézet frissítés Utasítás: Action Listener Növelés, csökkentés 20/18
MVC Fontos: A MVC modell nem keverendő össze a háromrétegű alkalmazás architektúrával! Megjelenítési réteg Alkalmazáslogikai réteg Erőforráskezelő réteg Bár nagyon hasonlítanak, a háromrétegű alkalmazás rétegei külön-külön számítógépeken valósulnak meg (a skálázhatóság miatt), míg az MVC modell szerint felépülő program egyetlen számítógépen fut. 20/19
VÉGE VÉGE 20/20