Честно говоря, я не думаю, что ваш подход - лучший способ справиться с этим. На самом деле вы можете просто использовать шаблон наблюдателя или EventBus, чтобы уведомить докладчиков о получении данных. Таким образом, вы можете отделить своего презентатора от модели. Это должно сделать всю архитектуру немного чище.
Отвечая на ваш вопрос:
Все ваши отдельные элементы не должны напрямую взаимодействовать друг с другом. Вместо этого реальная реализация должна быть скрыта за интерфейсом. Это означает, что представление ничего не знает о презентаторе (оно даже не знает о существовании класса презентатора), оно знает только интерфейс предоставляет вызовы, необходимые для представления.
Таким образом, вы можете просто определить интерфейс для связи между ModelManager и презентатором:
interface ModelToPresenterInterface {
void returnData(Object data);
}
Все ваши докладчики должны реализовать это (конечно):
public myPresenter implements ModelToPresenterInterface {
void returnData(Object data){
// put your business logic here
}
}
При этом вы можете просто передать интерфейс (который реализован каждым из ваших докладчиков) в ModelManager. Вероятно, этого не должно происходить в конструкторе, так как будет только один экземпляр вашего менеджера, который будет использоваться каждым докладчиком.
static class ModelManager{
List<ModelToPresenterInterface> callbackList = new ArrayList<>();
void addListeningPresenter(ModelToPresenterInterface presenter){
callbackList.push(presenter);
}
public onReturnData(Object data){
for (int i = 0;i<callbackList.size();++i){
callbackList.get(i).returnData(object);
}
}
}
Если вы уверены, что всегда есть только один докладчик, заинтересованный в ваших данных (чтобы не было докладчиков ниже по стеку), вы также можете просто используйте одну переменную, которая перезаписывается для каждого нового докладчика.
Также будьте очень осторожны, удаляя докладчиков из списка, когда он уничтожается! (в противном случае это приведет к серьезным утечкам памяти)
Еще раз: я действительно думаю, что вы получите лучшие результаты, используя EventBus или что-то подобное, но эта версия также должна работать. Надеюсь, я смог помочь и дайте мне знать, если у вас есть дополнительные вопросы :)
person
Bmuig
schedule
29.03.2018