如何在Android MVP中应用组合?

时间:2018-03-16 10:19:11

标签: android design-patterns mvp software-design

最近我接手了一个建立在MVP之上的android项目。虽然简单的屏幕非常简单,易于阅读和维护,但应用程序中更复杂的部分却不是。多个继承级别导致我在类之间切换几天,试图找出信息流实际上是如何工作的。

这里有一个更有问题的层次结构的例子:

inheritance

由于我们使用MVP,因此图中的每个类自然会有另一个presenter类和另一个视图类。

所以我做了一些研究并发现了这篇文章:Composition vs Inheritance in MVP 并且它基本上说在这种情况下,组合应该优于继承。 不说的是如何在android中应用它。我想了一会儿,但不能想出一个漂亮的模式。我可以做自定义视图,但他们最终会如何使用演示者?

2 个答案:

答案 0 :(得分:6)

继承尽管非常强大,但很容易被滥用,当不可避免的情况发生时,即需求发生变化时,由于其不灵活性,继承很容易破坏open-closed principle。程序员必须修改现有的类,这反过来会破坏客户端代码。 这就是为什么组合通常比继承更受青睐的原因。它可以根据需求的变化提供更大的灵活性。

这个设计原则恰恰说明了:

  • 封装各种不同的内容。 确定代码的变化方面并将其分开 什么保持不变。这样我们就可以在不影响其余代码的情况下改变它们。

继续讨论你的问题,我在阅读你的问题后首先想到的是:为什么不使用Strategy Pattern!

您可以采取的方法是:

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

无论我在上一段中说过什么都可能令人困惑(我的英语也不是那么好:D),但我刚刚解释了策略模式的工作,仅此而已。

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

  • 编程到界面,而不是实现。策略模式使用它来实现变化的代码。

答案 1 :(得分:2)

我一直处于类似情况。我最终做的是将“Base”中的功能分离到单独的类中,然后将其用作组合。它也与在类似结构中使用地图有关。

您可以创建一个新的类MyAppMapView,它可以扩展FrameLayout(或任何最适合您的布局)。这可以包含所有与Map相关的代码(包括MapView),您可以在此处使用自定义MapView相关函数,如onStart()onResume()onPause()onStop()。此外,您可以将与地图相关的所有内容放在标记,线条等中。

完成后,您可以在new MyAppMapView()MapViewSimpleFragment中使用MapViewDetailsFragment(或使用com.example.MyAppMapView将其添加到xml中),因为这两个类都可以将 撰写 您的自定义MyAppMapView类,您可以从片段调用所有与地图相关的函数,如绘图标记,线条,onStart()等。