Я пытаюсь реализовать шаблон Observer в приложении JavaFx. Я никогда не задавал здесь вопросов, но это сводит меня с ума.
По сути, я пытаюсь использовать шаблон Observer для мониторинга класса, который анализирует файл телефонных номеров, и автоматически обновляет пользовательский интерфейс при анализе файла.
Прежде чем я перейду к своим вопросам, вот мой код:
Абстрактный класс Observer.java
public abstract class Observer
{
public PhoneBook numbers;
public abstract void update();
}
У меня есть класс, который реализует это:
public class PhoneBookObserver extends Observer {
public PhoneBookObserver(PhoneBook numbers)
{
this.numbers = numbers;
this.numbers.attach(this);
}
@Override
public void update()
{
System.out.println(""NUMBER - : " + numbers.GetNumbers());
}
}
В классе, выполняющем синтаксический анализ, я создал новый PhoneBookObserver.
public PhoneBook ParsePhoneBook()
{
PhoneBook nums= new PhoneBook();
PhoneBookObserver p = new PhoneBookObserver(nums);
// ... Parsing of file - works fine
return nums;
}
В настоящее время это работает, и мой println из update() в PhoneBookObserver выводится.
Мои вопросы:
- Может ли метод обновления PhoneBookObserver обновить мой пользовательский интерфейс? Как он получит доступ к элементам JavaFx в моем контроллере?
- Могу ли я просто сделать свой контроллер наблюдателем, переопределить update() и использовать его для обновления элементов пользовательского интерфейса из моего контроллера? Это плохо?
PhoneBookObserver
как внутренний класс в контроллере, либо (эквивалентно) предоставил реализацию верхнего уровня, которая имела бы ссылку на контроллер. TBH, я бы, вероятно, удалил полеnumbers
изObserver
- на самом деле оно не служит никакой цели, посколькуupdate()
на него не ссылается. Затем вы можете сделатьObserver
интерфейс. И тогда можно просто передать лямбда-выражение вPhoneBook.attach(...)
, и теперь тривиально создать реализацию прямо в контроллере... - person James_D   schedule 03.03.2017