I. Wzorce kreacyjne
1. Singleton
2. Budowniczy
3. Prototyp
4. Fabryka
5. Fabryka abstrakcyjna
II. Wzorce strukturalne
1. Adapter
2. Most
3. Kompozyt
4. Dekorator
5. Fasada
6. Pyłek
7. Pełnomocnik
III. Wzorce czynnościowe
1. Łańcuch zobowiązań
2. Polecenie
3. Interpreter
4. Iterator
5. Mediator
6. Pamiątka
7. Obserwator
8. Stan
9. Strategia
10. Metoda szablonowa
11. Odwiedzający

Iterator - wzorzec projektowy (design pattern) - java

1. Cel:
Wzorzec iterator jest świetnym wzorcem do zapewnienia nawigacji
bez eksponowania struktury obiektu.Upraszcza i ukrywa algorytm.
2. Problem:
Chcemy przejść przez kontener, taki jak kolekcje (Collection).
Lists, Map, Set są przykładami kolekcji.
Poruszanie się po różnych strukturach może mieć różne algorytmy
lub podejścia do przeglądania danych.

3. Rozwiązanie:
A przypadku wzorca iterator nie ujawniamy podstawowej struktury obiektu
po którym chcemy się poruszać.
Iterator oddziela dane z algorytmu użytego do przejścia przez dane.
Podstawą wzorca jest interface Iterator oraz implementacja konkretnego iteratora
Pętla foreach iteruje po interface-ie Iterable lub tablicy,
więc możemy interface Iterator tutaj zastosować.

4. Diagram klas wzorca Iterator:


5. Implementacja:
Klasa testująca:
  1. public class IteratorTest {
  2. public static void main(String[] args) {
  3. ChannelCollection channels = populateChannels();
  4. ChannelIterator baseIterator = channels.iterator(ChannelTypeEnum.ALL);
  5. System.out.println("Kanały wszystkie:");
  6. while (baseIterator.hasNext()) {
  7. Channel c = baseIterator.next();
  8. System.out.println(c.toString());
  9. }
  10. System.out.println("Kanały polskie:");
  11. // Channel Type Iterator
  12. ChannelIterator englishIterator = channels.iterator(ChannelTypeEnum.POLISH);
  13. while (englishIterator.hasNext()) {
  14. Channel c = englishIterator.next();
  15. System.out.println(c.toString());
  16. }
  17. }
  18.  
  19. private static ChannelCollection populateChannels() {
  20. ChannelCollection channels = new ChannelCollectionImpl();
  21. channels.addChannel(new Channel(98.5, ChannelTypeEnum.ENGLISH));
  22. channels.addChannel(new Channel(99.5, ChannelTypeEnum.POLISH));
  23. channels.addChannel(new Channel(100.5, ChannelTypeEnum.FRENCH));
  24. channels.addChannel(new Channel(101.5, ChannelTypeEnum.ENGLISH));
  25. channels.addChannel(new Channel(102.5, ChannelTypeEnum.POLISH));
  26. channels.addChannel(new Channel(103.5, ChannelTypeEnum.FRENCH));
  27. channels.addChannel(new Channel(104.5, ChannelTypeEnum.ENGLISH));
  28. channels.addChannel(new Channel(105.5, ChannelTypeEnum.POLISH));
  29. channels.addChannel(new Channel(106.5, ChannelTypeEnum.FRENCH));
  30. return channels;
  31. }
  32. }
Klasy obsługujące wzorzec iterator:
  1. public class Channel {
  2.  
  3. private double frequency;
  4. private ChannelTypeEnum TYPE;
  5.  
  6. public Channel(double freq, ChannelTypeEnum type){
  7. this.frequency=freq;
  8. this.TYPE=type;
  9. }
  10.  
  11. public double getFrequency() {
  12. return frequency;
  13. }
  14.  
  15. public ChannelTypeEnum getTYPE() {
  16. return TYPE;
  17. }
  18.  
  19. @Override
  20. public String toString(){
  21. return "Frequency="+this.frequency+", Type="+this.TYPE;
  22. }
  23.  
  24. }
  25.  
  26. public enum ChannelTypeEnum {
  27.  
  28. ENGLISH, FRENCH, POLISH, ALL;
  29. }
interface-y i implementacja iteratora:
  1. public interface ChannelIterator {
  2. boolean hasNext();
  3. Channel next();
  4. }
  5.  
  6. public interface ChannelCollection {
  7.  
  8. void addChannel(Channel c);
  9. void removeChannel(Channel c);
  10. ChannelIterator iterator(ChannelTypeEnum type);
  11.  
  12. }
  13.  
  14. public class ChannelCollectionImpl implements ChannelCollection {
  15.  
  16. private List<Channel> channelsList;
  17.  
  18. public ChannelCollectionImpl() {
  19. channelsList = new ArrayList<>();
  20. }
  21.  
  22. public void addChannel(Channel c) {
  23. this.channelsList.add(c);
  24. }
  25.  
  26. public void removeChannel(Channel c) {
  27. this.channelsList.remove(c);
  28. }
  29.  
  30. @Override
  31. public ChannelIterator iterator(ChannelTypeEnum type) {
  32. return new ChannelIteratorImpl(type, this.channelsList);
  33. }
  34.  
  35. private class ChannelIteratorImpl implements ChannelIterator {
  36.  
  37. private ChannelTypeEnum type;
  38. private List<Channel> channels;
  39. private int position;
  40.  
  41. public ChannelIteratorImpl(ChannelTypeEnum ty,
  42. List<Channel> channelsList) {
  43. this.type = ty;
  44. this.channels = channelsList;
  45. }
  46.  
  47. @Override
  48. public boolean hasNext() {
  49. while (position < channels.size()) {
  50. Channel c = channels.get(position);
  51. if (c.getTYPE().equals(type) || type.equals(ChannelTypeEnum.ALL)) {
  52. return true;
  53. } else
  54. position++;
  55. }
  56. return false;
  57. }
  58.  
  59. @Override
  60. public Channel next() {
  61. Channel c = channels.get(position);
  62. position++;
  63. return c;
  64. }
  65.  
  66. }
  67. }

Wynik programu jest następujący:
Kanały wszystkie:
Frequency=98.5, Type=ENGLISH
Frequency=99.5, Type=POLISH
Frequency=100.5, Type=FRENCH
Frequency=101.5, Type=ENGLISH
Frequency=102.5, Type=POLISH
Frequency=103.5, Type=FRENCH
Frequency=104.5, Type=ENGLISH
Frequency=105.5, Type=POLISH
Frequency=106.5, Type=FRENCH
Kanały polskie:
Frequency=99.5, Type=POLISH
Frequency=102.5, Type=POLISH
Frequency=105.5, Type=POLISH
6. Zastosowanie w kodzie java:
- java.util.Iterator
- java.util.Scanner
- java.util.Enumeration
created by cv.java.org.pl © 2023 All Rights Reserved.