Çok basit bir ifadeyle (diğer cevaplar sizi yine de tüm resmi tasarım modellerine yönlendiriyor, bu yüzden daha fazla ayrıntı için onlara bakın):
Programınızın ekosistemindeki diğer sınıflar tarafından izlenen bir sınıfa sahip olmak istiyorsanız, sınıfın gözlemlenebilir olmasını istediğinizi söylersiniz. Yani, programın geri kalanına yayınlamak isteyebileceğiniz bazı değişiklikler olabilir.
Şimdi, bunu yapmak için bir çeşit yöntem çağırmalıyız. Gözlemlenebilir sınıfın, onu gözlemlemek isteyen sınıflarla sıkı bir şekilde birleştirilmesini istemiyoruz. Belirli kriterleri yerine getirdiği sürece kimin olduğu umurumda değil. (Bir radyo istasyonu olduğunu düşünün, frekanslarına ayarlanmış bir FM radyoya sahip oldukları sürece kimin dinlediğini umursamıyor). Bunu başarmak için Gözlemci olarak adlandırılan bir arayüz kullanıyoruz.
Bu nedenle, Gözlemlenebilir sınıfında bir Gözlemciler listesi bulunur (örneğin Gözlemci arabirimi yöntemlerini uygulayan örnekler olabilir). Ne zaman bir şey yayınlamak isterse, yöntemi tüm gözlemcilerde birbiri ardına çağırır.
Bulmacayı kapatmak için son şey Gözlemlenebilir sınıfın kimin ilgilendiğini nasıl bileceğidir? Dolayısıyla, Gözlemlenebilir sınıf, Gözlemcilerin çıkarlarını kaydetmelerine izin verecek bazı mekanizmalar sunmalıdır. addObserver(Observer o)
Dahili gibi bir yöntem , Gözlemciyi gözlemciler listesine ekler, böylece önemli bir şey olduğunda, listede dolaşır ve listedeki her bir örneğin Gözlemci arabiriminin ilgili bildirim yöntemini çağırır.
Röportajda size açıkça java.util.Observer
ve java.util.Observable
genel kavram hakkında soru sormamış olabilirler . Kavram, Java'nın gerektiğinde hızlı bir şekilde uygulamanıza yardımcı olmak için kutudan çıkar çıkmaz doğrudan destek sağladığı bir tasarım deseni. Bu yüzden, gerçek yöntemler / sınıflar yerine (anlamanız gerektiğinde bulabileceğiniz) kavramı anlamanızı öneririm.
GÜNCELLEME
Yorumunuza yanıt olarak, gerçek java.util.Observable
sınıf aşağıdaki olanakları sunar:
java.util.Observer
Örneklerin bir listesini tutmak . Bildirim almakla ilgilenen yeni örnekler üzerinden eklenebilir addObserver(Observer o)
ve bu durumlar kaldırılabilir deleteObserver(Observer o)
.
Dahili bir durumu korumak, gözlemcilere son bildirimden sonra nesnenin değişip değişmediğini belirtmek. Bu yararlıdır çünkü Observable
değiştiğini söylediğiniz bölümü , değişiklikleri bildirdiğiniz bölümden ayırır . (Örn. Birden fazla değişiklik olması ve her bir küçük adımdan ziyade yalnızca işlemin sonunda bildirimde bulunmak istiyorsanız faydalıdır). Bu ile yapılır setChanged()
. Yani sadece bir şeyi değiştirdiğinizde çağırırsınız Observable
ve geri kalanının Observers
sonunda bunu bilmesini istersiniz .
Tüm gözlemcilere belirli Observable
durumun değiştiğini bildirmek . Bu ile yapılır notifyObservers()
. Bu setChanged()
, bildirime devam etmeden önce nesnenin gerçekten değişip değişmediğini (yani bir çağrı yapıldı) kontrol eder. Object
Bildirim ile bazı ek bilgiler iletmek istemeniz durumunda, biri bağımsız değişken ve biri bağımsız değişken içeren 2 sürüm vardır . Dahili olarak, sadece Observer
örnek listesi üzerinden yinelenmesi ve update(Observable o, Object arg)
her biri için yöntemi çağırmasıdır . Bu, Observer
hangisinin değişen Gözlemlenebilir nesne olduğunu (birden fazla gözlemliyor olabilirsiniz) ve Object arg
potansiyel olarak bazı ekstra bilgileri (geçilen) taşımak için ekstra olanı belirtir notifyObservers()
.