Wzorzec projektowy Iterator
Zadanie programistyczne
Zadaniem wzorca Iterator
jest stworzenie możliwości iteracji po elementach kolekcji.
Rozwiązanie
- Tworzymy interface
Iterator
. - Tworzymy implementację tego interface:
MenuIterator
. - Tworzymy interaface
Menu
zawierające metodę tworzącąIterator
. - Tworzymy klasę
PozycjaMenu
. - Tworzymy klasę
MenuObiadowe
implementujące menu i zawierające tablicę
PozycjaMenu[]
po której będzie można iterować.
Klasy
Interface Iterator
package iterator; public interface Iterator { boolean hasNext(); Object next(); }
Klasa MenuIteraor
package iterator; public class MenuIterator implements Iterator { PozycjaMenu[] pozycje; int pozycja = 0; public MenuIterator(PozycjaMenu[] pozycje) { this.pozycje = pozycje; } @Override public Object next() { PozycjaMenu menuItem = pozycje[pozycja]; pozycja = pozycja + 1; return menuItem; } @Override public boolean hasNext() { if (pozycja >= pozycje.length || pozycje[pozycja] == null) { return false; } else { return true; } } }
Interface Menu
package iterator; public interface Menu { public Iterator createIterator(); }
Klasa PozycjaMenu
package iterator; public class PozycjaMenu { String nazwa; String opis; boolean wegetarianskie; double cena; public PozycjaMenu(String nazwa, String opis, boolean wegetarianskie, double price) { this.nazwa = nazwa; this.opis = opis; this.wegetarianskie = wegetarianskie; this.cena = price; } public String getNazwa() { return nazwa; } public String getOpis() { return opis; } public boolean isWegetarianskie() { return wegetarianskie; } public double getCena() { return cena; } @Override public String toString() { return (nazwa + ", $" + cena + "\n " + opis); } }
Klasa MenuObiadowe
package iterator; public class MenuObiadowe implements Menu { static final int MAX_LICZBA_DAN = 6; int liczbaDan = 0; PozycjaMenu[] pozycjeMenu; public MenuObiadowe() { pozycjeMenu = new PozycjaMenu[MAX_LICZBA_DAN]; addItem("Zupa z serc baranich", "na ostro. Danie dnia", false, 17.99); addItem("Zupa ze smoczego ziela", "z dodatkiem jajek strusich na twardo", true, 2.99); addItem("Placki ziemniaczane po rycersku", "w sosie truflowym", true, 3.29); addItem("Baran pieczony", "w płomieniu metanowym", false, 3.05); addItem("Smocze kłącza w syropie", "truskawkowym wykopywane o północy w czasie nowiu", true, 3.99); addItem("Owcze móżdżki na słodko", "w syropie klonowym", false, 3.89); } public void addItem(String nazwa, String opis, boolean wegetarianskie, double cena) { PozycjaMenu pozycjaMenu = new PozycjaMenu(nazwa, opis, wegetarianskie, cena); if (liczbaDan >= MAX_LICZBA_DAN) { System.err .println("Menu kompletne! Nie mogę dodać więcej pozycji do menu"); } else { pozycjeMenu[liczbaDan] = pozycjaMenu; liczbaDan = liczbaDan + 1; } } public PozycjaMenu[] getPozycjeMenu() { return pozycjeMenu; } @Override public Iterator createIterator() { return new MenuIterator(pozycjeMenu); } }
Klasa Main
package iterator; public class Main { public static void main(String args[]) { MenuObiadowe menuObiadowe = new MenuObiadowe(); PozycjaMenu[] pozycjeMenu = menuObiadowe.getPozycjeMenu(); for (int i = 0; i < pozycjeMenu.length; i++) { PozycjaMenu pozycja = pozycjeMenu[i]; System.out.print(pozycja.getNazwa()); System.out.println("\t\t" + pozycja.getCena()); System.out.println("\t" + pozycja.getOpis()); } } }
Klasa Main2
package iterator; public class Main2 { public static void main(String args[]) { MenuObiadowe menuObiadowe1 = new MenuObiadowe(); Iterator iterator = menuObiadowe1.createIterator(); while (iterator.hasNext()) { PozycjaMenu pozycjaMenu1 = (PozycjaMenu) iterator.next(); System.out.println(pozycjaMenu1.getNazwa() + " " + pozycjaMenu1.getCena() + " " + pozycjaMenu1.getOpis()); } } }
Wynik
Po uruchomieniu klasy Main
otrzymujemy:
Zupa z serc baranich 17.99 na ostro. Danie dnia Zupa ze smoczego ziela 2.99 z dodatkiem jajek strusich na twardo Placki ziemniaczane po rycersku 3.29 w sosie truflowym Baran pieczony 3.05 w płomieniu metanowym Smocze kłącza w syropie 3.99 truskawkowym wykopywane o północy w czasie nowiu Owcze móżdżki na słodko 3.89 w syropie klonowym
Po uruchomieniu klasy Main2
otrzymujemy:
Zupa z serc baranich 17.99 na ostro. Danie dnia Zupa ze smoczego ziela 2.99 z dodatkiem jajek strusich na twardo Placki ziemniaczane po rycersku 3.29 w sosie truflowym Baran pieczony 3.05 w płomieniu metanowym Smocze kłącza w syropie 3.99 truskawkowym wykopywane o północy w czasie nowiu Owcze móżdżki na słodko 3.89 w syropie klonowym