У меня есть интерфейс FooModel
и класс DefaultFooModel
, которые имеют несколько простых свойств. Я застреваю в свойстве boolean enable
, потому что хочу, чтобы это было вето / отложено:
public interface FooModel {
public boolean isEnabled();
/** returns old value */
public boolean setEnable(boolean enable);
public void addFooListener(FooModel.Listener listener);
public void removeFooListener(FooModel.Listener listener);
public interface Listener {
public void onFooEnableUpdate(boolean newEnable, boolean oldEnable);
}
}
Я хочу, чтобы модель M была центральной точкой доступа для свойства enable
. Но вот последовательность событий, которые я хочу, чтобы произошли:
- view V (или любой пользователь модели M) вызывает
FooModel.setEnable(enable)
в произвольном потоке.
FooModel может:
а. немедленно вызвать onFooEnableUpdate(newEnable, oldEnable)
для каждого из слушателей в произвольном порядке
б. запустить потенциально длинную последовательность событий, в результате чего другой объект (например, контроллер C) может решить, следует ли включить, и каким-то образом сообщить FooModel, в результате чего свойство enable
может быть обновлено, и затем мы продолжим как обычно в (a) выше.
Дело в том, что я не уверен, как это сделать.
Подход 1: механизм для этого не должен быть частью интерфейса модели. Вместо этого у моего DefaultFooModel есть реализация, которая принимает FooController
:
public interface FooController {
public void onFooEnableRequest(boolean newEnable, boolean oldEnable);
}
Когда вызывается DefaultFooModel.setEnable()
, он вызывает FooController.onFooEnableRequest()
. Ожидается, что контроллер вернется немедленно, но может занять некоторое время, чтобы обработать запрос, а затем позже вызвать DefaultFooModel.updateEnable()
, что вызовет реальный onFooEnableUpdate()
.
Подход 2: встроить что-то в интерфейс FooModel, но я не уверен, что.
Подход 3: Не встраивайте ничего в FooModel, просто сделайте так, чтобы он обрабатывал обычное свойство. Вместо этого Контроллер прослушивает FooModel.onFooEnableUpdate () и сразу переопределяет setEnable к старому значению, а затем вызывает FooModel.setEnable (), чтобы установить новое значение.
Любой совет?