Ç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.Observerve java.util.Observablegenel 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.Observablesı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ü Observabledeğ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 Observableve geri kalanının Observerssonunda bunu bilmesini istersiniz .
Tüm gözlemcilere belirli Observabledurumun 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. ObjectBildirim 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, Observerhangisinin değişen Gözlemlenebilir nesne olduğunu (birden fazla gözlemliyor olabilirsiniz) ve Object argpotansiyel olarak bazı ekstra bilgileri (geçilen) taşımak için ekstra olanı belirtir notifyObservers().