Iterator'ı diğer benzer yapılara kıyasla özel kılan şeyin ne olduğunu merak ediyorum ve bu da Dörtlü Çeteyi bir tasarım deseni olarak listeledi.
Yineleyici polimorfizme (ortak bir arayüze sahip koleksiyonlar hiyerarşisi) ve endişelerin ayrılmasına (koleksiyonlar üzerinde yineleme, verilerin yapılandırılma biçiminden bağımsız olmalıdır) dayanmaktadır.
Ancak, koleksiyonlar hiyerarşisini, örneğin, güç nesneleri gibi bu nesneler üzerindeki bazı ilgili işlemleri temsil eden bir sınıfla, matematiksel nesnelerin (tamsayı, kayan nokta, karmaşık, matris vb.) Hiyerarşisi ve yineleyici ile değiştirirsek. Sınıf diyagramı aynı olurdu.
Muhtemelen aynı şekilde çalışan Yazar, Ressam, Kodlayıcı ve muhtemelen daha iyi olanlar gibi daha birçok benzer örnek bulabiliriz. Ancak bunların hiçbirinin Tasarım Deseni olarak adlandırıldığını hiç duymadım.
Peki, Iterator'ı özel yapan nedir?
Koleksiyondaki mevcut pozisyonu saklamak için değişebilir bir duruma ihtiyaç duyduğundan daha karmaşık bir durum mudur? Ama sonra, değişebilir durum genellikle arzu edilen bir şey olarak kabul edilmez.
Demek istediğim açıklığa kavuşmak için daha ayrıntılı bir örnek vereyim.
İşte tasarım sorunumuz:
Diyelim ki bir sınıflar hiyerarşisi ve bu sınıfların nesneleri üzerinde tanımlanmış bir işlemimiz var. Bu işlemin arabirimi her sınıf için aynıdır, ancak uygulamalar tamamen farklı olabilir. Ayrıca, işlemin farklı parametrelerle aynı nesneye birden çok kez uygulanmasının mantıklı olduğu varsayılmaktadır.
İşte tasarım problemimiz için mantıklı bir çözüm (pratikte yineleyici modelinin genelleştirilmesi):
Endişelerin ayrılması için, operasyonun uygulamaları orijinal sınıf hiyerarşisine (işlenen nesneler) fonksiyon olarak eklenmemelidir. İşlemi aynı işlenene birden çok kez uygulamak istediğimizden, yalnızca bir işlevle değil, işlenene referansı tutan bir nesne ile temsil edilmelidir. Bu nedenle işlenen nesnesi, işlemi temsil eden nesneyi döndüren bir işlev sağlamalıdır. Bu nesne, gerçek işlemi gerçekleştiren bir işlev sağlar.
Bir örnek:
MathObject
Türetilmiş sınıflarla bir temel sınıf veya arayüz (aptal isim, biliyorum, belki birinin daha iyi bir fikri vardır.) MyInteger
Ve MyMatrix
. Her biri MathObject
için Power
kare, küp vb. Hesaplamalara izin veren bir işlem tanımlanmalıdır. Böylece (Java ile) yazabiliriz:
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