说实话,我不认为您的方法是处理此问题的最佳方法。实际上,您可以只使用 观察者模式 或 EventBus 在收到数据时通知 presenters。这样你就可以让你的 presenter 与 model 分离.. 这应该会使整个架构更干净一些。
但要回答你的问题:
所有单独的项目不应直接相互通信。相反,真正的实现应该隐藏在接口后面。这意味着,view 不知道关于 presenter 的任何事情(它甚至不知道存在 presenter 类),它只知道接口公开视图需要的调用。
这样您就可以简单地为 ModelManager 和 presenter 之间的通信定义一个接口:
interface ModelToPresenterInterface {
void returnData(Object data);
}
您所有的演示者都需要实现这一点(当然):
public myPresenter implements ModelToPresenterInterface {
void returnData(Object data){
// put your business logic here
}
}
这样,您只需将接口(您的每个演示者都实现)传递给ModelManager。这可能不会发生在构造函数中,因为每个 presenter 只会使用一个管理器实例。
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);
}
}
}
只要您确定始终只有一个 presenter 对您的数据感兴趣(这样就没有 presenters 进一步向下堆栈)然后您也可以只使用一个变量,该变量会被每个新的 presenter 覆盖。
还要非常小心,当演示者被破坏时,您确实要从列表中删除它!(否则会造成严重的内存泄漏)
再说一次:我真的认为使用 EventBus 或类似的东西会得到更好的结果,但这个版本也应该可以工作。希望我能提供帮助,如果您还有其他问题,请告诉我:)