2010-12-03 19 views
7

Ben birkaç diğer gözlemlenebilir nesneler, aynı türdeki tüm gözlemlemek mümkün istiyorum bir nesne varsa. Mesela ben bir B ve C. B ve C ikisi de gözlemlenebilir uygulamak gerçeği dışında, tamamen un-ilişkilidir gözlemlemek mümkün istiyorum.java instanceof operatörünü kaçınırken birden gözlenebilirleri Gözlem?

bariz çözüm sadece güncelleme yöntemi içinde "örneği ise" kullanmak ama bu hızla dağınık hale gelebilir ve başka bir yolu varsa gibi merak ediyorum? Üste Geri Bildirim Ver Daha fazla bilgi

cevap

7

Eğer güncellemek değiştirebilir.

public void update(Observable o, Object arg) { 
    try{ 
    Method update = getClass().getMethod(o.getClass(), Object.class); 
    update.invoke(this, o, arg); 
    } catch(Exception e) { 
    // log exception 
    } 
} 

Bu şekilde gözlemlemek istediğiniz her türü için bir yöntem

public void update(A a, Object arg); 
public void update(B b, Object arg); 
public void update(C c, Object arg); 

ekleyebilir. Ne yazık ki Gözlemlenebilir'in kesin beton tipini bilmeniz gerekiyor. Ancak, arabirimlere vb. Izin vermek için yansımaları değiştirebilirsiniz.

0

B/C nesnesindeki işlemlerin aynı olacağını ve yalnızca devlet hokkabazlık amacıyla iki nesneyi ayırmak istediğinizi varsayarsak, gerçek gözlem mantığı/durumunu uygulayan ve bir arama kullanan bir temsilci nesnesi de oluşturabilirsiniz. Ana nesnenizdeki belirli Gözlemlenebilir nesne için doğru delege almak için mekanizma. Ardından çağrıları yönlendirin.

0

Her zaman dinleyici bir Map<Class<? extends Event>, EventHandler> sahip olabilir. Benzer, ama açık 'instanceof' operatörü. Bir haritada containsKey() ile değiştirilir. önceki önerilere benzer

12

Temiz bir çözüm, A iç sınıflarını (anonim) Observer s olarak kullanmak için kullanmak olacaktır. Örneğin:

class A { 
    public A(B b, C c) { 
     b.addObserver(new BObserver()); 
     c.addObserver(new CObserver()); 
    } 

    private class BObserver implements Observer { 
     // Logic for updates on B in update method 
    } 

    private class CObserver implements Observer { 
     // Logic for updates on C in update method 
    } 
} 

Bu aslında izlemek istiyorum B ler ve C s ancak birçok BObserver/CObserver örneklerini eklemek için izin verecektir. A'un ortak arabiriminin daha az dağınık olduğu ve D, E ve F sınıflarını işlemek için kolayca yeni iç sınıflar ekleyebilirsiniz.

+3

Neredeyse kesinlikle iç sınıflarınızı anonim hale getirmek istiyorsunuz. –

+0

Genel olarak, evet, ancak bu örnek için adlandırılmış sınıflar bunu biraz daha okunabilir kılar. –

İlgili konular