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

时间:2011-02-06 21:20:17

标签: android design-patterns

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

e.g。在iOS中,模型 - 视图 - 控制器与委托和其他模式一起使用非常广泛。

Android使用什么模式以及特定用途?

修改

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

12 个答案:

答案 0 :(得分:312)

我尝试使用model–view–controller(MVC)和model–view–presenter设计模式进行android开发。我的发现是模型 - 视图 - 控制器工作正常,但有一些“问题”。这一切都取决于您如何看待Android Activity类。它是控制器,还是视图?

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

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

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

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

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

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

查看 - 它包含您的UI组件,并为它们处理事件。

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

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

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

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

答案 1 :(得分:76)

2018年11月更新

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

所以,我发布了一个关于Android应用程序架构的完整视频课程。因此,如果您有兴趣掌握Android开发中最先进的架构模式,check out this comprehensive course here

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

看起来您正在寻找architectural patterns而不是design patterns

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

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

另一方面,

架构模式不涉及特定的软件任务 - 它们旨在根据软件组件的用例为软件组织提供模板。问题

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

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

Enter image description here

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

但今天情况有所不同 - 谷歌最近发布了Data Binding library,它与Android Studio完全集成,甚至推出了一套architecture blueprints for Android applications

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

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

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

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

这个MVC不只是在美学上与其他人不同 - 它基于Activities in Android are not UI Elements的理论,这对代码组织有很大的影响。

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

答案 2 :(得分:54)

enter image description here

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

我希望你会发现它有用。

答案 3 :(得分:47)

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

  • 广播接收器使用观察者模式
  • 远程处理器服务调用使用代理模式
  • 查看和查看组使用复合模式
  • 媒体框架使用Facade模式

答案 4 :(得分:23)

以下是关于Common Design Patterns for Android的精彩文章:

创作模式:

  • 构建器(例如 AlertDialog.Builder
  • 依赖注入(例如 Dagger 2
  • 的Singleton

结构模式:

  • 适配器(例如 RecyclerView.Adapter
  • Facade(例如 Retrofit

行为模式:

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

答案 5 :(得分:15)

以下Android类使用设计模式

1)View Holder使用Singleton Design Pattern

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

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

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

5)View使用Composite Design Pattern

6)Media FrameWork使用FaçadeDesignPattern

答案 6 :(得分:10)

Notifications案例中,Refused to load the script 'http://localhost:35729/livereload.js?snipver=1' because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-inline' 'unsafe-eval'". 使用构建器模式

NotificationCompat.Builder

答案 7 :(得分:5)

Android也使用ViewHolder设计模式。

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

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

答案 8 :(得分:4)

所有这些模式,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测试,以确保其质量。

答案 9 :(得分:2)

我想添加一个已在Android Framework中应用的设计模式。这是Asynctask实现中使用的半同步半异步模式。见

的讨论

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

答案 10 :(得分:1)

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

示例:IntentService类的设计。

IntentService接收Intents,启动一个工作线程,并根据需要停止服务。所有请求都在一个工作线程上处理。

答案 11 :(得分:0)

Binder使用" Observer Pattern"对于死亡收件人通知。