Zielony Smok - logo witryny

Wzorzec projektowy Iterator

Zadanie programistyczne

Zadaniem wzorca Iterator jest stworzenie możliwości iteracji po elementach kolekcji.

Rozwiązanie

  1. Tworzymy interface Iterator.
  2. Tworzymy implementację tego interface: MenuIterator.
  3. Tworzymy interaface Menu zawierające metodę tworzącą Iterator.
  4. Tworzymy klasę PozycjaMenu.
  5. 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