2010-12-03 1 views
7

Если у меня есть объект, который я хочу, чтобы иметь возможность наблюдать несколько других наблюдаемых объектов, не всех одного типа. Например, я хочу, чтобы A мог наблюдать B и C. B и C полностью не связаны друг с другом, за исключением того факта, что оба они реализуют Observable.Наблюдение нескольких наблюдаемых при исключении экземпляра оператора в java?

Очевидным решением является использование «if instanceof» внутри метода обновления, но это быстро может стать беспорядочным, и поэтому мне интересно, есть ли другой способ?

ответ

7

Как и в предыдущих предложениях, вы можете изменить свое обновление.

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 
    } 
} 

Таким образом, вы можете добавить один метод

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

для каждого типа вы хотите наблюдать. К сожалению, вам нужно знать конкретный конкретный тип Observable. Однако вы можете изменить отражения, чтобы разрешить интерфейсы и т. Д.

0

Предполагая, что операции над объектом B/C будут идентичными, и вы просто хотите различать два объекта для целей жонглирования состояния, вы также можете создать объект-делегат, который реализует фактическую логику наблюдения/состояние и использует поиск механизм в вашем основном объекте для извлечения правого делегата для конкретного объекта Observable. Затем переадресуйте вызовы.

0

У вас всегда может быть Map<Class<? extends Event>, EventHandler> в вашем слушателе. Аналогичный, но не явный оператор «instanceof». Он заменяется на карту containsKey().

12

Чистым решением было бы использовать (анонимные) внутренние классы в A, чтобы действовать как Observer. Например:

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 
    } 
} 

Это позволит вам добавить BObserver/CObserver экземплярам однако многие B s и s C вы действительно хотите, чтобы наблюдать. Он имеет дополнительную выгоду, поскольку открытый интерфейс A менее загроможден, и вы можете легко добавить новые внутренние классы для обработки классов D, E и F.

+3

Почти наверняка вы хотите сделать свои внутренние классы анонимными. – 2010-12-04 01:20:06

Смежные вопросы