Android上使用哪些架构模式?

我正在做一个关于移动平台的小研究,我想知道Android使用了哪些设计模式?

例如,在iOS中,模型-视图-控制器与委托和其他模式一起被广泛使用。

Android使用什么模式,在哪里使用?

编辑

我并不是要求在内核、dalvik等深层使用的设计模式,而是应用程序开发人员在开发应用程序时将遇到的模式。

162587 次浏览

我尝试使用模型-视图-控制器 (MVC)和model-view-presenter架构模式来进行android开发。我的发现是模型-视图-控制器工作得很好,但有几个“问题”。这一切都取决于你如何看待Android Activity类。它是控制器还是视图?

实际的Activity类并没有扩展Android的View类,但它确实处理了向用户显示窗口的问题,并处理了该窗口的事件(onCreate, onPause等)。

这意味着,当你使用MVC模式时,你的控制器实际上是一个伪视图控制器。因为它处理的是向用户显示窗口,以及您使用setContentView添加到它的附加视图组件,并且还处理至少各种活动生命周期事件的事件。

在MVC中,控制器应该是主要的入口点。如果将其应用到Android开发中,这是有争议的,因为活动是大多数应用程序的自然入口。

正因为如此,我个人认为model-view-presenter模式非常适合Android开发。因为视图在这个模式中的角色是:

  • 作为入口的
  • 渲染组件
  • 将用户事件路由到演示者

这允许你像这样实现你的模型:

视图 -它包含你的UI组件,并为它们处理事件。

主持人 -这将处理你的模型和视图之间的通信,把它看作是你的模型的网关。意思是,如果你有一个复杂的领域模型表示,天知道,你的视图只需要这个模型的一个非常小的子集,演示者的工作是查询模型,然后更新视图。例如,如果您有一个包含一段文本、一个标题和字数的模型。但是在给定的视图中,您只需要在视图中显示标题。然后演示者将从模型中读取所需的数据,并相应地更新视图。

模型 -这基本上应该是你的全域模型。希望它也能帮助您使域模型更加“紧凑”,因为您不需要像上面提到的那样使用特殊的方法来处理情况。

通过将模型与视图完全解耦(通过使用演示器),测试模型也变得更加直观。您可以为域模型进行单元测试,也可以为演示器进行单元测试。

试试吧。我个人认为它非常适合Android开发。

Android框架中使用了多种模式,例如:

  • 广播接收器使用观察者模式
  • 远程服务调用使用代理模式
  • 视图和视图组使用复合模式
  • 媒体框架使用立面模式

我想添加一个设计模式,已经应用在Android框架。这是在Asynctask实现中使用的半同步半异步模式。请参阅我在

https://docs.google.com/document/d/1_zihWXAwgTAdJc013-bOLUHPMrjeUBZnDuPkzMxEEj0/edit?usp=sharing

所有这些模式,MVC, MVVM, MVP和演示模型,都可以应用到Android应用中,但如果没有第三方框架,就不容易获得组织良好的结构和干净的代码。

MVVM起源于PresentationModel。当我们将MVC、MVVM演示模型应用到Android应用程序时,我们真正想要的是有一个清晰的结构化项目,更重要的是更容易进行单元测试。

目前,如果没有第三方框架,通常会有大量代码(如addXXListener()、findViewById()等),这不会增加任何业务价值。更重要的是,你必须运行Android单元测试,而不是正常的JUnit测试,后者需要很长时间才能运行,并且使单元测试有些不切实际。

由于这些原因,几年前我们开始了一个开源项目,RoboBinding -一个用于Android平台的数据绑定表示模型框架。RoboBinding帮助您编写更易于阅读、测试和维护的UI代码。RoboBinding消除了对不必要的代码,如addXXListener等的需求,并将UI逻辑转移到表示模型,这是一个POJO,可以通过正常JUnit检验进行测试。RoboBinding本身带有300多个JUnit测试,以确保其质量。

Android也使用ViewHolder设计模式。

它用于提高滚动ListView时的性能。

ViewHolder设计模式使您能够访问每个列表项视图,而不需要进行查找,从而节省宝贵的处理器周期。具体来说,它避免了在ListView滚动期间频繁调用findViewById(),这将使其平滑。

2018年11月更新

在关于Android中的MVC和MVP的工作和博客上写了几年之后(见下面的答案正文),我决定以一种更全面、更容易理解的形式来捕捉我的知识和理解。

所以,我发布了一个完整的关于Android应用程序架构的视频课程。所以,如果你有兴趣掌握Android开发中最先进的架构模式,点击这里查看这门综合课程

为了保持2016年11月的相关性,我们更新了这个答案


看起来你正在寻找架构模式而不是设计模式

设计模式旨在描述一个一般的“诡计”;程序员可能实现处理一组特定的重复出现的软件任务。例如:在OOP中,当需要一个对象通知一组其他对象有关某些事件时,可以使用观察者设计模式

由于Android应用程序(以及大多数AOSP)是用面向对象的Java编写的,我认为你很难找到一个在Android上不使用的单一OOP设计模式。

另一方面,架构模式并不处理特定的软件任务——它们旨在根据所讨论的软件组件的用例为软件组织提供模板

这听起来有点复杂,但我希望通过一个示例来阐明:如果某个应用程序将用于从远程服务器获取数据并以结构化的方式将其呈现给用户,那么MVC可能是一个很好的考虑对象。请注意,我没有提到应用程序的软件任务和程序流程——我只是从用户的角度描述它,从而出现了架构模式的候选。

既然你在问题中提到了MVC,我猜架构模式是你想要的。

Enter image description here


从历史上看,谷歌并没有关于应用程序架构的官方指导方针,这(以及其他原因)导致了Android应用程序源代码的混乱。事实上,即使在今天,我所看到的大多数应用程序仍然没有遵循面向对象的最佳实践,也没有显示出代码的清晰逻辑组织。

但今天的情况不同了——谷歌最近发布了数据绑定库,它与Android Studio完全集成,甚至还推出了一套Android应用程序的架构蓝图

两年前,在Android上很难找到关于MVC或MVP的信息。今天,MVC、MVP和MVVM已经成为“流行语”。在Android社区中,我们被无数的专家包围着,他们不断地试图说服我们MVx比MVy更好。在我看来,讨论MVx是否比MVy更好是完全没有意义的,因为术语本身是非常模糊的——只要看看这个问题的答案,你就会意识到不同的人可以将这些缩写与完全不同的结构联系起来。

由于对Android最佳架构模式的搜索已经正式开始,我想我们将会看到更多的想法浮出水面。在这一点上,真的不可能预测哪种(或哪种)模式将在未来成为行业标准——我们需要等待和观察(我猜这是一两年的问题)。

然而,我可以非常有信心地做出一个预测:数据绑定库的使用将不会成为行业标准。我有信心这样说,因为数据绑定库(在其当前的实现中)提供了短期的生产力提高和某种架构指南,但从长远来看,它将使代码不可维护。一旦这个库的长期影响浮出水面——它就会被抛弃。


现在,尽管我们现在确实有一些官方的指导方针和工具,但我个人并不认为这些指导方针和工具是可用的最佳选择(而且它们肯定不是唯一的选择)。在我的应用程序中,我使用自己的MVC架构实现。它简单、干净、可读、可测试,并且不需要任何额外的库。

这个MVC不只是表面上不同于其他MVC——它是基于Android中的活动不是UI元素的理论,这对代码组织有巨大的影响。

所以,如果你正在为遵循固体原则的Android应用程序寻找一个好的架构模式,你可以在我关于Android中的MVC和MVP架构模式的帖子中找到一个描述。

通知的情况下,NotificationCompat.Builder使用建造者模式

就像,

mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_stat_notification)
.setContentTitle(getString(R.string.notification))
.setContentText(getString(R.string.ping))
.setDefaults(Notification.DEFAULT_ALL);

在Android中,“工作队列处理器”模式通常用于从应用程序主线程中卸载任务。

示例:IntentService类的设计。

IntentService接收intent,启动工作线程,并适当地停止服务。所有请求都在一个工作线程上处理。

以下Android类使用设计模式

1)视图持有者使用单例设计模式

2)意图使用工厂设计模式

3)适配器使用适配器设计模式

4)广播接收端采用观察者设计模式

5)视图使用复合设计模式

6)媒体框架使用Façade设计模式

下面是一篇关于Android的通用设计模式的很棒的文章:

创建型模式:

  • 构建器(例如AlertDialog。构建器)
  • 依赖注入(例如匕首2)
  • 单例

结构模式:

  • 适配器(例如RecyclerView。适配器)
  • Facade(例如改造)

行为模式:

  • 命令(例如EventBus)
  • 观察者(例如RxAndroid)
  • 模型视图控制器
  • ViewModel (类似于上面的MVC模式)

Binder对死亡接收人通知使用“观察者模式”。

enter image description here

当我读到这篇文章时,它真的帮助我通过例子来理解模式,所以我做了下面的表格来清楚地看到设计模式&他们在Android框架中的例子

我希望它对你有帮助。