Android上使用了哪些设计模式?

Bur*_*jua 257 android design-patterns

我正在对移动平台进行一项小型研究,我想知道Android中使用了哪些设计模式?

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

哪些模式以及Android使用的具体位置?

编辑

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

Jus*_*yul 316

我尝试使用模型 - 视图 - 控制器(MVC)和模型 - 视图 - 展示器设计模式来进行android开发.我的发现是模型 - 视图 - 控制器工作正常,但有一些"问题".这一切都取决于你如何看待Android Activity类.它是一个控制器,还是一个视图?

实际的Activity类不会扩展Android的View类,但它会处理向用户显示窗口并处理该窗口的事件(onCreate,onPause等).

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

在MVC中,控制器应该是主要的入口点.如果在将其应用于Android开发时就是这种情况,这有点争议,因为活动是大多数应用程序的自然切入点.

因此,我个人发现模型 - 视图 - 演示者模式非常适合Android开发.由于视图在此模式中的作用是:

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

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

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

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

模型 - 这基本上应该是您的完整域模型.希望它有助于使您的域模型更加"紧密",因为您不需要特殊的方法来处理上面提到的案例.

通过将模型与视图一起解耦(通过使用演示者),测试模型也变得更加直观.您可以为您的域模型进行单元测试,并为演示者进行单元测试.

试试看.我个人认为它非常适合Android开发.

  • 很棒的答案!我有问题:1.活动=查看,我做对了吗?2.您是否将演示者实现为自己的公共类,或者作为Activity的内部类?还是片段(也是内部类)?3.您是否应该使用转移类而不是活动(视图)中的实际模型类? (14认同)
  • 是的,我将它们用作MVP模式中的视图.2.就个人而言,我将它们划分为单独的公共课程,但这是我认为的一个品味问题:) 3.我解释得很差,句子"转发所需的课程"是误导性的.我的意思是,演示者位于视图和模型之间,它读取模型然后更新视图.我会更新我的答案,以便更清楚:) (14认同)
  • 我真的很喜欢Android开发,因为它是高度分离的.我如何使用MVC:纯粹为用户IO使用活动,并使用本地服务进行所有处理.当服务想要展示某些东西时 - 将其广播给您的活动!当其他开发人员在活动中处理太多时,我真的很讨厌它. (11认同)
  • @SomeoneSomewhere为什么没有一个类在单独的线程/ AsyncTasks中处理这个东西,为什么一个服务呢? (8认同)

Vas*_*liy 81

2018年11月更新

在Android上工作和写博客关于MVC和MVP多年后(见下面的答案正文),我决定以更全面,易于理解的形式捕捉我的知识和理解.

所以,我发布了一个关于Android应用程序架构的完整视频课程.因此,如果您对掌握Android开发中最先进的架构模式感兴趣,请查看此综合课程.

此答案已更新,以便在2016年11月之前保持相关性


看起来你正在寻找建筑模式而不是设计模式.

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

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

另一方面,架构模式不涉及特定的软件任务 - 它们旨在基于所讨论的软件组件的使用情况为软件组织提供模板.

这听起来有点复杂,但我希望一个例子可以澄清:如果某个应用程序将用于从远程服务器获取数据并以结构化方式呈现给用户,那么MVC可能是一个很好的考虑因素.请注意,我没有谈到应用程序的软件任务和程序流程 - 我只是从用户的角度描述它,并且出现了一个架构模式的候选者.

既然你在你的问题中提到了MVC,我猜想你正在寻找的是架构模式.

在此输入图像描述


从历史上看,谷歌没有关于应用程序架构的官方指南,这些指导原因导致Android应用程序源代码完全混乱.实际上,即使在今天,我看到的大多数应用程序仍然没有遵循OOP最佳实践,也没有显示清晰的代码逻辑组织.

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

两年前,很难在Android上找到有关MVC或MVP的信息.今天,MVC,MVP和MVVM已成为Android社区中的"嗡嗡声",我们被无数专家所包围,不断试图让我们相信MVx比MVy更好.在我看来,讨论MVx是否比MVy更好是完全没有意义的,因为术语本身非常模糊 - 只要看看这个问题的答案,你会发现不同的人可以将这些缩写与完全不同的结构联系起来.

由于Android的最佳架构模式的搜索已经正式启动,我认为我们将看到更多的想法被曝光.在这一点上,真的不可能预测未来哪种模式(或模式)将成为行业标准 - 我们需要拭目以待(我想这是一两年的事情).

但是,我可以高度自信地做出一个预测:数据绑定库的使用不会成为行业标准.我有信心说,因为数据绑定库(在其当前实现中)提供了短期的生产力提升和某种架构指南,但它将使代码在长期内不可维护.一旦这个图书馆的长期影响浮出水面 - 它将被放弃.


现在,虽然我们今天确实有某种官方指南和工具,但我个人并不认为这些指南和工具是最好的选择(而且它们绝对不是唯一的选择).在我的应用程序中,我使用自己的MVC架构实现.它简单,干净,可读且可测试,不需要任何额外的库.

这个MVC不仅仅是在美学上与众不同 - 它基于一个理论,即Android中的活动不是UI元素,这对代码组织有很大的影响.

因此,如果您正在寻找遵循SOLID原则的Android应用程序的良好架构模式,您可以在我的帖子中找到关于Android中的MVC和MVP架构模式的描述.

  • 为提供这样的资源做得好!谢谢! (2认同)

Pet*_*ter 68

在此输入图像描述

当我到达这篇文章时,它真的帮助我通过示例理解模式,所以我在下面的表格中清楚地看到了Android框架中的设计模式及其示例

我希望你会发现它有用.

  • 请**[编辑]**您的帖子并将实际内容显示为文字而不是屏幕截图.其他人无法复制和粘贴您的图片或帮助您修复拼写错误.[请参阅此处](https://meta.stackoverflow.com/a/285557/1402846)了解详情.谢谢. (3认同)

小智 47

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

  • 广播接收器使用Observer模式
  • 远程服务调用使用代理模式
  • 视图和视图组使用复合模式
  • 媒体框架使用Facade模式

  • 可以请你分享链接(参考) (5认同)

Ine*_*eta 25

这是一篇关于Android常见设计模式的精彩文章:

创作模式:

  • 构建器(例如AlertDialog.Builder)
  • 依赖注入(例如Dagger 2)
  • 独生子

结构模式:

  • 适配器(例如RecyclerView.Adapter)
  • 门面(例如改造)

行为模式:

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


Jac*_*ham 15

以下Android类使用设计模式

1)View Holder使用Singleton Design Pattern

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

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

4)广播接收器使用观察者设计模式

5)View使用Composite Design Pattern

6)Media FrameWork使用FaçadeDesignPattern


Jef*_* T. 10

Notifications案例中,NotificationCompat.Builder使用Builder Pattern

喜欢,

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);
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是Builder模式. (3认同)

Che*_*eng 5

所有这些模式,MVC、MVVM、MVP 和Presentation Model都可以应用于 Android 应用程序,但是如果没有第三方框架,则不容易获得组织良好的结构和干净的代码。

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

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

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


ama*_*tel 5

Android也使用ViewHolder设计模式.

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

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