Следуя шаблону проектирования Model-view-controller , модель не должна содержать ссылку на свой контроллер. Если контроллеру необходимо реагировать на изменения данных модели, это можно сделать с помощью свойств и прослушивателей. Модель содержит свойство (здесь StringProperty ), и контроллер прослушивает изменения свойства.
Для вашего кода это означает сохранение msg
в StringProperty
. Контроллер после построения модели присоединяет ChangeListener
, который вызывает displayMsg
, когда модель получает сообщение.
Используя свойство и слушатель, TheModel
больше не сохраняет ссылку на GUIController
и не принимает GUIController
в качестве параметра в своем конструкторе.
GUIController
будет выглядеть примерно так:
public class GUIController extends Application {
...
TheModel myModel;
...
GUIController(){
myModel = new TheModel();
// Listen for changes in the msg StringProperty and call displayMessage when it changes
myModel.getMsgProperty().addListener(msg -> this.displayMsg(msg));
}
...
Обратите внимание, что конструктору для GUIController
больше не нужно передавать this
в конструктор TheModel
. (Как правило, избегайте передачи this
за пределы конструктора . Объект не полностью построен, пока конструктор не вернется.)
TheModel
будет выглядеть примерно так:
public class TheModel implements ClientInt {
...
private StringProperty msgProperty;
...
// remember to add a getter and setter for msgProperty!
...
@Override
public void receive(String msg) throws RemoteException {
// When a message is received, listeners attached to msgProperty will execute when setValue is called
msgProperty.setValue(msg);
}