Как обрабатывать несколько наблюдаемых свойств в Obsever Pattern? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть класс 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 .

Есть совет?Возможно, я не очень хорошо понимал паттерн наблюдателя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...