ZH mintapélda Feladat Írjon Java alkalmazást, amely képes hallgatók rekordjaittárolni és azokat különbözo rendezo kulcsok szerint sorba rendezni. A program grafikus felhasználói felületén keresztül új rekordokat lehet felvenni, illetve a korábban bevitt rekordokat lehet megjeleníteni. A Save gomb megnyomásakor a kitöltött mezoket elmentjük egy láncolt listában. Az elozo rekordot a Previous, a soron következot pedig a Next gomb megnyomásával tudjuk megnézni. A Sort by Name és a Sort by Code gombokkal a lista elemeit lehet ABC sorrendbe rendezni név, illetve kód szerint. A programot a Model-View Controller paradigma szabályai szerint tervezze meg. Törekedjen arra, hogy a program rugalmasan bovítheto legyen (például a rekordokat ki lehessen egészíteni a lakcímmel, születési dátummal, stb.) A különbözo kulcsok szerint elvégezheto rendezést implementálja a rekordok összességét reprezentáló objektum stratégiájaként. 2 / 17 Felület 3 / 17
View public class View extends Frame Control control; TextField nametextfield, codetextfield; Button prevbutton, nextbutton, savebutton, sortbynamebutton, sortbycodebutton; void display(model model) { if(model.endoflist()) { nametextfield.settext (""); codetextfield.settext (""); return; String name = model.getname(); if(name!= null) nametextfield.settext(name ); else nametextfield.settext (""); String code = model.getcode (); if(code!= null) codetextfield.settext(code); else codetextfield.settext (""); public String getnamefield () { return nametextfield.gettext (); public String getcodefield() { return codetextfield.gettext (); public View(Control c) { 4 / 17 View konstruktora public View(Control c) { control = c; setlayout(new BorderLayout()); Panel panelnorth= new Panel(); add("north", panelnorth); Panel panelcenter = new Panel(); add("center", panelcenter); Panel panelsouth = new Panel(); add("south", panelsouth); panelnorth.add(new Label("Name:")); panelnorth.add(nametextfield= new TextField("", 30)); panelcenter.add(new Label("Code:")); panelcenter.add(codetextfield= new TextField("", 6)); panelsouth.add(savebutton = new Button("Save")); panelsouth.add(prevbutton= new Button("Previous")); panelsouth.add(nextbutton= new Button("Next")); panelsouth.add(sortbynamebutton= new Button("Sort by Name")); panelsouth.add(sortbycodebutton = new Button("Sort by Code")); // eseményfigyelok regisztr álása... pack(); show(); 5 / 17 Eseményfigyelok regisztrálása public View(Control c) { control = c; savebutton.addactionlistener(control.getsavelistener()); prevbutton.addactionlistener(control.getprevlistener()); nextbutton.addactionlistener(control.getnextlistener()); sortbynamebutton.addactionlistener( control.getsortbynamelistener()); sortbycodebutton.addactionlistener( control.getsortbycodelistener()); addwindowlistener(control.getwindowlistener()); pack(); show(); 6 / 17
Controller public class Control { View view; Model model; ActionListenersaveListener, prevlistener, nextlistener, sortbynamelistener, sortbycodelistener; WindowListener windowlistener; public Control() { model = new Model(); savelistener = new ActionListener() { public void actionperformed(actionevent e){ model.save(view.getnamefield(), view.getcodefield()); ; prevlistener = new ActionListener() { public void actionperformed(actionevent e){ model.prev(); view.display(model); ; nextlistener = new ActionListener() { public void actionperformed(actionevent e){ model.next(); view.display(model); ; sortbynamelistener = new ActionListener() { public void actionperformed(actionevent e){ model.sortbyname(); ; sortbycodelistener = new ActionListener() { public void actionperformed(actionevent e){ model.sortbycode(); ; windowlistener = new WindowAdapter() { public void windowclosing(windowevent e){ System.exit(0); ; view = new View(this); // public static void main (String[] args) { new Control(); 7 / 17 Controller public class Control { View view; Model model; // public ActionListener getsavelistener() { return savelistener; public ActionListener getprevlistener() { return prevlistener; public ActionListener getnextlistener() { return nextlistener; public ActionListener getsortbynamelistener() { return sortbynamelistener; public ActionListener getsortbycodelistener() { return sortbycodelistener; public WindowListener getwindowlistener() { return windowlistener; public static void main (String[] args) { new Control(); 8 / 17 Stratégia alkalmazása Az objektumok viselkedésének egy bizonyos aspektusát függetlenül akarjuk kezelni: nem csak egy osztály, hanem egy osztályhierarchia viselkedését akarjuk variálni (kombinatorikus robbanás elkerülése) egy adott viselkedést leíró kód egységbe zárása az eredeti osztály egyszerusítése azáltal, hogy a viselkedés egy aspektusa jól elkülönül egy interfészen keresztül 9 / 17
Felelosségek és együttmuködés Környezet környezetinterfész() Stratégia algoritmusinterfész() KonkrétStratégiaA algoritmusinterfész() KonkrétStratégiaB algoritmusinterfész() 10 / 17 Felelosségek és együttmuködés Stratégia definiálja a viselkedési variációk közös interfészét KonkrétStratégia megvalósít egy konkrét viselkedési variációt Környezet viselkedésének egy részét a KonkrétStratégia objektummal együttmuködve határozza meg a kommunikáció a Stratégia interfészen keresztül történik átadja a variáció megvalósításához szükséges adatokat, vagy a saját referenciáját a KonkrétStratégia objektumnak 11 / 17 Adaptáció a feladathoz Model LinkedList list SortingStrategy int compare(student, Student) SortingByName int compare(student, Student) SortingByCode int compare(student, Student) 12 / 17
Rendezés mint stratégia interface SortingStrategy { int compare(student s1, Student s2); class SortingByName implements SortingStrategy { public int compare(student s1, Student s2) { return s1.name.compareto(s2.name); class SortingByCode implements SortingStrategy { public int compare(student s1, Student s2) { return s1.code.compareto(s2.code); 13 / 17 Iterátor használata Kliens hasnext() next() remove() ListIterator List listiterator() LinkedList.Itr hasnext() next() remove() LinkedList listiterator() 14 / 17 Model public class Model { SortingStrategy sortingstrategy; class Student implements Comparable{ String name, code; public Student(String n, String c) { name = n; code = c; public int compareto(object object) { return sortingstrategy.compare(this, (Student)object); List list; ListIteratoriterator; Student current = null; public Model() { list = new LinkedList(); iterator = list.listiterator(); public String getname() { if(current!= null) return current.name; return null; public String getcode() { if(current!= null) return current.code; return null; // 15 / 17
Model public class Model { SortingStrategysortingStrategy; public boolean prev() { if(iterator.hasprevious()) { current = ( Student)iterator.previous(); return true; current = null; return false; public boolean next() { if(iterator.hasnext()) { current = ( Student)iterator.next(); return true; current = null; return false; public boolean endoflist() { if(current == null) return true; return false; public void sortbyname() { sortingstrategy= new SortingByName(); Collections.sort(list); public void sortbycode() { sortingstrategy= new SortingByCode(); Collections.sort(list); public void save(string n, String c) { iterator.add(new Student(n, c)); 16 / 17 Comparator interfész interface Comparator { intcompare(objecto1, Object o2); boolean equals(object obj); Rendezés a komparátor objektummal: Collections.sort(List list, Comparator c) ; 17 / 17