Návrhové vzory Java (design patterns): Iterator

Dnes sa pozrieme na ďalší návrhový vzor Iterator (java design patterns) z kategórie vzorov správania (behavioral patterns). Návrhové vzory v tejto kategórii sa zaoberajú komunikáciou (interaction) medzi objektami a ich zodpovednosťou (responsibility). Čo je návrhový vzor Iterator? Návrhový vzor Iterator v objektovo-orientovanom programovaní poskytuje spôsob, ako systematicky pristupovať k prvkom objektu a prechádzať ich uložené v nejakom kontajneri bez poznania jeho vnútornej reprezentácie. Zároveň oddeľuje algoritmy aplikovateľné na prvky od kontajnera. Aký problém návrhový vzor Iterator rieši? Rieši problém efektívneho prístupu k prvkom v kolekcii, pričom skrýva štruktúru tejto kolekcie. Jeho hlavným cieľom je poskytnúť jednotný spôsob prechádzania cez rôzne typy kolekcií bez toho, aby sme museli poznať ich vnútornú štruktúru. Tento vzor definuje rozhranie Iterator, ktoré štandardne obsahuje metódy ako next(), hasNext() atď. Konkrétne implementácie tohto rozhrania sú poskytované triedami, ktoré implementujú kolekcie, napríklad zoznamy, množiny, polia a podobne. Príklad Iterator implementácie v Jave Vytvoríme si program na pridávanie poznámok a použitím návrhového vzoru Iterator si ukážeme ako môžeme k nim jednoducho pristupovať a prechádzať nimi. Rozhranie budeme vytvárať ako šablónu (template), aby sa dalo použiť pre ľubovoľný dátový typ. Iterator.java package designpatterns; // Rozhranie pre iterator public interface Iterator<T> { boolean hasNext(); T next(); } Rozhranie Iterator definuje metódy hasNext() a next(). Prvá metóda by mala kontrolovať, či existuje ďalší prvok, druhá potom vracať ďalší prvok. ListIterator.java package designpatterns; import java.util.List; // Konkretny iterator pre zoznam (List) public class ListIterator<T> implements Iterator<T> { private List<T> zoznam; private int pozicia; public ListIterator(List<T> zoznam) { this.zoznam = zoznam; this.pozicia = 0; } @Override public boolean hasNext() { return pozicia < zoznam.size(); } @Override public T next() { if(this.hasNext()) return zoznam.get(pozicia++); return null; } } ListIterator implementuje rozhranie Iterator a poskytuje konkrétnu implementáciu pre zoznam (List). Uchováva referenciu na zoznam (List<T>) a sleduje aktuálnu pozíciu pre iteráciu. Metóda hasNext() kontroluje, či existuje ďalší prvok v zozname. Metóda next() vracia ďalší prvok v zozname a posúva pozíciu na nasledujúci prvok. Poznamky.java package designpatterns; import java.util.ArrayList; import java.util.List; public class Poznamky<T> { private List<T> poznamky; public Poznamky() { this.poznamky = new ArrayList<>(); } public void pridajPoznamku(T poznamka) { poznamky.add(poznamka); } public Iterator<T> iterator() { return new ListIterator<>(poznamky); } } Trieda Poznamky uchováva zoznam poznámok (v tomto prípade typu T). Metóda pridajPoznamku() pridá novú poznámku do zoznamu. Metóda iterator() vytvára a vracia inštanciu ListIterator, ktorá slúži na iterovanie cez poznámky v zozname. Main.java import designpatterns.Iterator; import designpatterns.Poznamky; public class Main { public static void main(String[] args) { Poznamky<String> poznamky = new Poznamky<>(); poznamky.pridajPoznamku( Zajtra bude snežiť. ); poznamky.pridajPoznamku( Čoskoro budú Vianoce. ); poznamky.pridajPoznamku( Treba nakúpiť darčeky. ); // Pouzitie iteratora na prechadzanie cez pridane poznamky Iterator<String> iterator = poznamky.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); } } } Main je klientska trieda, ktorá demonštruje použitie tohto návrhového vzoru. Vytvára inštanciu Poznamky konkrétneho typu String, pridáva niekoľko poznámok a potom pomocou iterátora prechádza nimi a vypisuje ich. Výstup z tohto príkladu je: Zhrnutie Návrhový vzor Iterator sa používa štandardne na prechádzanie skupiny objektov v dátovej štruktúre, pričom nezáleží na konkrétnom type objektu. Tento vzor je tak často používaný, že v programovacích jazykoch existujú už predefinované triedy. Iterator nemusí prechádzať len na ďalší objekt, ale dajú sa naimplementovať aj tak, že napríklad v stromovej štruktúre budú prechádzať do šírky alebo do hĺbky. Pripravili sme pre teba súbory so spomínaným príkladom vo forme kódu, ktorý si môžeš spustiť priamo v Jave. Stiahni si kód Java Iterator tu. Ak si Java programátor a hľadáš prácu, pozri si naše benefity pre zamestnancov a reaguj na voľné pracovné miesta. The post Návrhové vzory Java (design patterns): Iterator first appeared on msgprogramator.sk.

prejsť na článok

Návrhové vzory Java (design patterns): Facade

Dnes sa pozrieme na ďalší návrhový vzor Facade (java design patterns) z kategórie štrukturálnych vzorov (structural patterns). Návrhové vzory v tejto kategórii sa zaoberajú štruktúrou triedy, ako je dedičnosť (inheritance) a kompozícia (composition). Čo j

prejsť na článok

Návrhové vzory Java (design patterns): Decorator

Dnes sa pozrieme na ďalší návrhový vzor Decorator (java design patterns) z kategórie štrukturálnych vzorov (structural patterns). Návrhové vzory v tejto kategórii sa zaoberajú štruktúrou triedy, ako je dedičnosť (inheritance) a kompozícia (composition). Č

prejsť na článok

Návrhové vzory Java (design patterns): Chain of Reponsibility

Dnes sa pozrieme na prvý návrhový vzor Chain of Responsibility (java design patterns) z kategórie vzorov správania (behavioral patterns). Návrhové vzory v tejto kategórii sa zaoberajú komunikáciou (interaction) medzi objektami a ich zodpovednosťou (respon

prejsť na článok

Návrhové vzory Java (design patterns): Proxy

Dnes sa pozrieme na ďalší návrhový vzor Proxy (java design patterns) z kategórie štrukturálnych vzorov (structural patterns). Návrhové vzory v tejto kategórii sa zaoberajú štruktúrou triedy, ako je dedičnosť (inheritance) a kompozícia (composition). Čo je

prejsť na článok

Návrhové vzory Java (design patterns): Command

Dnes sa pozrieme na ďalší návrhový vzor Command (java design patterns) z kategórie vzorov správania (behavioral patterns). Návrhové vzory v tejto kategórii sa zaoberajú komunikáciou (interaction) medzi objektami a ich zodpovednosťou (responsibility). Čo j

prejsť na článok