如何在Android MVP中应用组合?

12

最近我接手了一个基于MVP的android项目。简单的屏幕非常直观易读、易维护,但是应用程序的更复杂部分却不是那么简单。多重继承层级让我花费了好几天来在各个类之间切换,试图找出信息流到底是如何工作的。

以下是一个比较麻烦的继承层次结构示例:

inheritance

由于我们使用MVP,自然地,每个图表中的类都有另一个presenter类和view类。

因此,我进行了一些研究,并找到了这篇文章:MVP中的组合与继承,基本上说,在这种情况下,应该优先选择组合而不是继承。

它没有说明如何在android中应用它。我想了一会儿,但无法想出一个好的模式。我可以做自定义视图,但最终它们如何使用presenter呢?

2个回答

8
继承虽然功能强大,但很容易被滥用。当需求发生变化时,由于其缺乏灵活性,继承极易破坏开闭原则。程序员不得不修改现有的类,这反过来又会破坏客户端代码,因此通常优先使用组合而非继承。这样可以提供更多的灵活性以适应变化的需求。
这个设计原则就是要:
  • 封装变化点。识别您代码中的变化点并将其与保持不变的内容分离开来。这样我们就可以更改它们而不影响代码的其他部分。
谈到你的问题,我读完你的问题之后想到的第一件事是:为什么不使用策略模式
你可以采取的方法是:

BaseMapViewFragment将包含所有派生类共有的代码。为不同种类的行为(变化的事物)创建单独的接口。您可以根据自己的要求创建具体的行为类。将这些行为接口引入BaseMapViewFragment的类字段中。现在,扩展BaseMapViewFragment的类将使用具体的行为类初始化所需的行为。

上面段落中我说的可能有点混乱(我的英语也不是很好:D),但我只是解释了策略模式的工作原理,没有更多的解释。

这里还有另一个设计原则:

  • 针对接口编程,而不是实现。策略模式使用它来实现变化的代码。

2
我曾经遇到过类似的情况。我最终做的是将“Base”中的功能分离成单独的类,然后使用组合。这也与在类似结构中使用Maps有关。
您可以创建一个新的类MyAppMapView,它可以扩展FrameLayout(或者适合您布局的任何内容)。这里可以包含所有与地图相关的代码(包括MapView),您可以在这里定义自定义的MapView相关函数,例如onStart()、onResume()、onPause()、onStop()。此外,您还可以将所有与地图相关的内容放在这里,例如标记、线条等。
一旦您完成了这些,您就可以在MapViewSimpleFragment和MapViewDetailsFragment中使用new MyAppMapView()(或使用com.example.MyAppMapView在xml中添加)了。由于这两个类都将组成您的自定义MyAppMapView类,因此您可以从Fragments中调用所有与地图相关的函数,例如绘制标记、线条、onStart()等。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接