Saya telah bertanya-tanya apa yang membuat Iterator istimewa jika dibandingkan dengan konstruksi serupa lainnya, dan yang membuat Gang of Four mencantumkannya sebagai pola desain.
Iterator didasarkan pada polimorfisme (hierarki koleksi dengan antarmuka umum) dan pemisahan masalah (iterasi pada koleksi harus independen dari cara data disusun).
Tetapi bagaimana jika kita mengganti hirarki koleksi dengan, misalnya, hirarki objek matematika (integer, float, complex, matrix dll) dan iterator oleh kelas yang mewakili beberapa operasi terkait pada objek-objek ini, misalnya fungsi daya. Diagram kelas akan sama.
Kami mungkin dapat menemukan banyak contoh serupa seperti Writer, Painter, Encoder, dan mungkin yang lebih baik, yang bekerja dengan cara yang sama. Namun saya belum pernah mendengar ini disebut Pola Desain.
Jadi apa yang membuat Iterator spesial?
Apakah ini fakta yang lebih rumit karena memerlukan keadaan yang bisa berubah untuk menyimpan posisi saat ini dalam koleksi? Tapi kemudian, keadaan yang bisa berubah biasanya tidak dianggap diinginkan.
Untuk memperjelas poin saya, izinkan saya memberikan contoh yang lebih rinci.
Inilah masalah desain kami:
Katakanlah kita memiliki hierarki kelas dan operasi yang didefinisikan pada objek kelas ini. Antarmuka operasi ini sama untuk setiap kelas, tetapi implementasinya dapat sangat berbeda. Juga diasumsikan bahwa masuk akal untuk menerapkan operasi beberapa kali pada objek yang sama, katakan dengan parameter yang berbeda.
Berikut adalah solusi yang masuk akal untuk masalah desain kami (praktis generalisasi dari pola iterator):
Untuk pemisahan masalah, implementasi operasi tidak boleh ditambahkan sebagai fungsi ke hierarki kelas asli (objek operan). Karena kita ingin menerapkan operasi beberapa kali pada operan yang sama, itu harus diwakili oleh objek yang memegang referensi ke operan, bukan hanya oleh fungsi. Oleh karena itu objek operan harus menyediakan fungsi yang mengembalikan objek yang mewakili operasi. Objek ini menyediakan fungsi yang melakukan operasi aktual.
Sebuah contoh:
Ada kelas dasar atau antarmuka MathObject
(nama bodoh, saya tahu, mungkin seseorang memiliki ide yang lebih baik.) Dengan kelas turunan MyInteger
dan MyMatrix
. Untuk setiap MathObject
operasi Power
harus didefinisikan yang memungkinkan perhitungan kuadrat, kubus dan sebagainya. Jadi kita bisa menulis (di Jawa):
MathObject i = new MyInteger(5);
Power powerOfFive = i.getPower();
MyInteger square = powerOfFive.calculate(2); // should return 25
MyInteger cube = powerOfFive.calculate(3); // should return 125