我正试图让我的头脑绕过一些MVP stuf,因为它与用户控件有关.我正在使用.NET WinForms(或接近它的东西)和监督控制器模式(好吧,我想我:).
用户控件本身是MVP应用程序的一部分(它的View和一个关联的Presenter等).Presenter始终首先启动,然后启动模型,然后启动View(s).View构建其UI,其中一部分将是新的UC,即View.
现在(表单)Presenter需要了解UC Presenter,但我认为它对View的组成方式一无所知.例如,Presenter表格不知道UC是表单控件集合的一部分,也不应该.
此外,不应改变设计经验; Iow视图(表单)的开发应该只能从工具箱中选择一个用户控件并将其放在表单上.
那么,关于我的问题.首先,我的假设是否正确?有点误导?弄乱?WTF你在想什么?
其次,是否正确(足够?)使表单View调用UC视图,表单Presenter调用UC Presenter并有一些机制告诉UC查看它的Presenter是什么?这打破了我的"Presenter first"规则,但我不确定如何做到这一点.
很高兴接受任何其他想法,建议和评论.
- nwahmaet
对于所有GWT大师的问题.
我是GWT的新手,我正在努力了解编写GWT应用程序的最佳实践.我已经完成了基于Ray Ryan在Google I/O 2009上的演讲的"大规模应用程序开发和MVP",它给了我一个很好的起点.我根据列出的最佳实践下载了联系人应用程序的示例源代码.
与示例"Contacts"应用程序相比,我正在尝试使用GWT开发的应用程序有点大(就所涉及的模块而言),因此我想将其拆分为多个函数.
我一直在阅读在GWT应用程序中有一个入口点是个好主意,我不想将所有代码转储到一个AppController类和一个RpcService中,在这种情况下最好的方法是什么?
我如何将控件分派给多个控制器?有没有办法使用GWT框架中的某些类来实现这一目的?
使用MVP,构造和依赖注入的正常顺序是什么.
通常,您为每个视图创建一个演示者,并将视图传递给构造函数上的演示者.但是,如果你有:
有人可以显示从用户点击到服务器返回服务的数据的正常信息流.
我只是在学习GWT,所以我还在努力解决它的所有怪癖和特征.我正在阅读他们给出的描述MVP模式的例子,我几乎得到它,除了我想知道一件事.
他们使用的AppController实现了ValueChangeHandler接口,并且在历史记录更改时触发onValueChange方法.
我的问题在于AppController中的onValueChange(我已将它包含在下面,供没有看过示例项目的人使用).它正在对发送的历史记录进行字符串比较,并实例化相应的演示者以处理该操作.对于具有3个动作的示例应用程序来说,这一切都很好,但是如何将其扩展为具有更多操作的真实应用程序?
坚持这种模式会导致相当大/丑else if,但我仍然太新GWT(和java)推断更大的应用程序更好的模式.
任何帮助是极大的赞赏!
public class AppController implements Presenter, ValueChangeHandler<String> {
...
public void onValueChange(ValueChangeEvent<String> event) {
String token = event.getValue();
if (token != null) {
Presenter presenter = null;
if (token.equals("list")) {
presenter = new ContactsPresenter(rpcService, eventBus, new ContactsView());
}
else if (token.equals("add")) {
presenter = new EditContactPresenter(rpcService, eventBus, new EditContactView());
}
else if (token.equals("edit")) {
presenter = new EditContactPresenter(rpcService, eventBus, new EditContactView());
}
if (presenter != null) {
presenter.go(container);
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 再次,与MVC相关的问题.几天前,我开始阅读Apple的Cocoa Fundamentals Guide,其中Apple解释了他们对MVC的实现.
在作为复合设计模式(链接)的MVC一章中,他们比较了两个MVC版本:
旧的/传统的SmallTalk版本:

Apple目前定义的版本:

他们将此当前模型描述如下:
此复合设计模式中的控制器对象包含Mediator模式以及策略模式; 它在两个方向上调节模型和视图对象之间的数据流.模型状态的变化通过 应用程序的控制器对象传递给视图对象.
传统模式看起来像MVC,没有错.但他们目前的模式名称让我感到困惑.据我所知,这可以看作是普通的MVP,因为Controller似乎总是在View和Model之间进行调解.
我完全错了,我是否误解了MVC或MVP?或者Apple只是使用了错误的名称?更重要的是,为什么这种模式称为MVC?
我一直在关注Google提供的MVP设计模式 来重构我的应用程序.我有一个MainActivity和许多片段,我为每个片段创建活动似乎很麻烦,所以我一直在考虑在片段中注册演示者.我所看到的是每个片段都注册了它自己的演示者,但我不确定它有多大的错误...... :)
所以这是我的演示者:
public class FirstPresenter implements FirstContract.Presenter {
private final FirstContract.View mView;
public FirstPresenter(FirstContract.View view) {
mView = view;
}
@Override
public void start() {
Log.e(TAG, "Start");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的片段:
public class FirstFragment extends Fragment implements FirstContract.View {
private FirstContract.Presenter mPresenter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container
, Bundle savedInstanceState) {
...
// I register firstFragment's presenter here.
mPresenter = new FirstPresenter(this);
...
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,这是正确的方法吗?我可以在活动中将Presenter注册到Fragment中吗?如果不是正确的方法,是否有一些很好的例子来处理一个活动和多个片段的MVP?
谢谢你们,BR!
我想知道我是否以正确的方式使用了干净的架构。我试图像这张图一样放置它:
我读过包结构应该按用例安排,但我很难理解如何做到这一点。
我们来看看我的包结构:
请注意,我不知道将活动真正放在 UI 文件夹中的什么位置,您能推荐一下吗?有关系吗?
在数据文件夹中,我有用于存储库设计模式的存储库。 我的改造网络调用与 UI 文件夹处于同一级别。我的依赖注入框架也是如此。
阅读此出版物后,我开始担心我现在想知道我的包结构是否正确?
我开始开发一个大型GWT应用程序,在阅读了大量文章和博客文章之后,我试图了解2.2 Model-View-Presenter和2.1 Activities-Places设计模式之间的区别是什么?你推荐哪种模式?为什么?我应该仅仅因为它是"更新"而使用MVP吗?另一方面,地方活动似乎更"直观"......或者我完全忽略了这一点,而MVP只是活动场所的改进版本?
感谢所有GWT大师们:-)
我遇到了需要嵌套MVP模式的场景.最好用一个可视化的例子来解释:
------------------------------
| [View] |
| | |
| +----[Presenter] |
| | |
| +------[Model] |
|____________________________|
|
+----[View]
|
+----[Presenter]
|
+------[Model]
Run Code Online (Sandbox Code Playgroud)
这就是两个MVP层应该如何交互的方式.我的问题是关于两者之间的联系.我可以设想几种方法来连接这两种方式:
哪个是正确的,如果有的话?
然后是他们如何联系的问题.第2层视图是否应该引用第1层中的一个对象?互动应该纯粹基于事件吗?两者的组合(如果是这样,参考应该在哪里?)?
我很擅长使用这些类型的模式,所以任何见解都会受到赞赏.
我正在开发遵循MVP架构的项目.通常,当我使用recyclerView时,我的演示者控制适配器数据.但是现在我需要使用来自缓存(或类似缓存的数据)的数据制作回收器适配器,回收器的大小不依赖于缓存大小,所以我通过HashMap进行缓存,其中密钥是 - 回收器的位置,如果有一个项目然后数据显示地图,否则空行与"添加事件"btn.我无法意识到这种结构中缓存的位置 - 模型(Dao或类似CacheManager)或适配器.
缓存的想法如下:我有一些类型的事件存储在数据库中,每个事件修改都在db中更改它 - 所以缓存也必须更新.
主要问题是:在哪里保留此缓存并将其加载到适配器,如何使其与数据库更改保持同步.
PS我也尝试使用RX,所以如果可以用它来解决 - 试试会很有趣.
PPS如果它是Repository模式是解决方法 - 欢迎.前一段时间阅读它.