У меня есть класс A, который реализует Observable.И класс B, который реализует Observer.B (мой наблюдатель) должен наблюдать более одного свойства A и действовать по-разному в зависимости от измененных свойств.Как я могу справиться с этим?
Я подумал добавить перечисление, представляющее отредактированные свойства (давайте назовем его ObservableObjectType), и отредактировать интерфейс Observable / Observer, чтобы передать его Observer в notifyObserver.
public interface Observer {
public void update(ObservableObjectType type, Object obj);
}
public interface Observable {
public void AddObserver(Observer observer);
public void RemoveObserver(Observer observer);
public void Notify(ObservableObjectType type, Object obj);
}
public enum ObservableObjectType {FOO,BAR,FOOBAR}
Чтобы в моем классе A что-то измениться, я мог передать ObservableObjectType
public class A implements Observable{
private X foo;
private X bar;
private Z foobar;
...
public setFoo(x){
this.foo=x;
this.Notify(ObservableObjectType.FOO, x);
}
public setBar(x){
this.bar=x;
this.Notify(ObservableObjectType.BAR, x);
}
public setFoobar(x){
this.foobar=x;
this.Notify(ObservableObjectType.FOOBAR, x)
}
А у моего класса-наблюдателя B есть метод обновления, такой как:
public void update(ObservableObjectType type, Object obj) {
switch(type) {
case FOO:
//something
break;
case BAR:
//something else
break;
case FOOBAR:
//again something else
break;
}
Я думаю, что это ужасный способ справиться с этой проблемой из-за уродливой расширяемости приведенного выше кода, если в будущем мне нужно будет добавить еще один параметр, чтобы наблюдать, я должен сначала добавить это в перечислениеи, кажется, не очень элегантный, как код.
Я пытался либо передать только тип объекта, и проверить метод обновления с помощью instance of
, но нужно ли мне делать 2 разных поведения для объекта одного типа?Как и в примере выше, переменная foo и bar .
Есть совет?Возможно, я не очень хорошо понимал паттерн наблюдателя.