Iterator pattern adalah mekanisme untuk mengakses koleksi seperti array, recordset pada database, isi directory dan isi file. Tujuan dari pola ini adalah untuk membuat interface yang berfungsi sebagai iterator yang dapat digunakan kembali (reusable). Pada dasarnya pola Iterator memungkinkan kita untuk membakukan dan menyederhanakan kode yang kita buat untuk bergerak melalui koleksi dalam kode anda.
Nih ada Video singkatnya
Nah untuk contoh program yang akan saya tampilkan disini, misalkan kita memiliki daftar channel Radio dan program client ingin menjelajah keseluruh channel satu demi satu berdasarkan tipe channelnya. Contohnya beberapa program client hanya tertarik ke channel Inggris dan ingin memproses hanya itu saja, mereka tidak mau mengakses channel lainya.
Jadi, kita dapat menyediakan koleksi channel channel ke client dan membiarkan mereka menuliskan logika yang digunakan untuk menjelajahi channel channel dan menentukan untuk memprosesnya. Tapi solusi ini memiliki banyak masalah semisal si client harus punya logika untuk menjelajah/melintasi channelnya, dan kita tidak bisa memastikan apakah logika si client itu benar, karena itu kalau jumlah klient kita terus meningkat, akan jadi sangat sulit untuk dipertahankan
Disini kita akan menggunakan Iterator pattern dan memberikan iterasi berdasarkan tipe channelnya.
Kita harus memastikan client program bisa mengakses daftar channel dari Iterator
public enum ChannelTypeEnum { ENGLISH, HINDI, FRENCH, ALL; }
public class Channel { private double frequency; private ChannelTypeEnum TYPE; public Channel(double freq, ChannelTypeEnum type){ this.frequency=freq; this.TYPE=type; } public double getFrequency() { return frequency; } public ChannelTypeEnum getTYPE() { return TYPE; } @Override public String toString(){ return "Frequency="+this.frequency+", Type="+this.TYPE; } } }
public interface ChannelCollection { public void addChannel(Channel c); public void removeChannel(Channel c); public ChannelIterator iterator(ChannelTypeEnum type); }
Interface ChannelCollection menetapkan kontrak dari implementasi class koleksi kita. Ingat, ada method untuk menambah dan menghapus channel tapi tidak ada method untuk me-return daftar channel.
ChannelCollection punya method me-return iterator untuk travesal(menjelajah/melintasi).ChannelIterator menentukan method berikut,
public interface ChannelIterator { public boolean hasNext(); public Channel next(); }
Sekarang base interface kita dan class inti sudah jadi, lanjut ke implementasi collection class dan iterator.
import java.util.ArrayList; import java.util.List; public class ChannelCollectionImpl implements ChannelCollection { private ListchannelsList; public ChannelCollectionImpl() { channelsList = new ArrayList<>(); } public void addChannel(Channel c) { this.channelsList.add(c); } public void removeChannel(Channel c) { this.channelsList.remove(c); } @Override public ChannelIterator iterator(ChannelTypeEnum type) { return new ChannelIteratorImpl(type, this.channelsList); } private class ChannelIteratorImpl implements ChannelIterator { private ChannelTypeEnum type; private List channels; private int position; public ChannelIteratorImpl(ChannelTypeEnum ty, List channelsList) { this.type = ty; this.channels = channelsList; } @Override public boolean hasNext() { while (position < channels.size()) { Channel c = channels.get(position); if (c.getTYPE().equals(type) || type.equals(ChannelTypeEnum.ALL)) { return true; } else position++; } return false; } @Override public Channel next() { Channel c = channels.get(position); position++; return c; } } }
public class IteratorPatternTest { public static void main(String[] args) { ChannelCollection channels = populateChannels(); ChannelIterator baseIterator = channels.iterator(ChannelTypeEnum.ALL); while (baseIterator.hasNext()) { Channel c = baseIterator.next(); System.out.println(c.toString()); } System.out.println("******"); // Channel Type Iterator ChannelIterator englishIterator = channels.iterator(ChannelTypeEnum.ENGLISH); while (englishIterator.hasNext()) { Channel c = englishIterator.next(); System.out.println(c.toString()); } } private static ChannelCollection populateChannels() { ChannelCollection channels = new ChannelCollectionImpl(); channels.addChannel(new Channel(98.5, ChannelTypeEnum.ENGLISH)); channels.addChannel(new Channel(99.5, ChannelTypeEnum.HINDI)); channels.addChannel(new Channel(100.5, ChannelTypeEnum.FRENCH)); channels.addChannel(new Channel(101.5, ChannelTypeEnum.ENGLISH)); channels.addChannel(new Channel(102.5, ChannelTypeEnum.HINDI)); channels.addChannel(new Channel(103.5, ChannelTypeEnum.FRENCH)); channels.addChannel(new Channel(104.5, ChannelTypeEnum.ENGLISH)); channels.addChannel(new Channel(105.5, ChannelTypeEnum.HINDI)); channels.addChannel(new Channel(106.5, ChannelTypeEnum.FRENCH)); return channels; } }
Nah, kalo programnya kita run, akan menghasilkan output sebagai berikut:
Referensi:
http://www.journaldev.com/1716/iterator-design-pattern-java
http://ryan-sponge.blogspot.co.id/2011/01/iterator-pattern.html
Tidak ada komentar :
Posting Komentar