Android使用哪些架构模式?[关闭]


267

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

例如,在iOS中,Model-view-controller与委托和其他模式一起被广泛使用。

Android使用什么模式,特别是在什么地方使用?

编辑

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


2
鉴于Android平台集成了Linux内核,因此除了“到目前为止已命名的所有模式,如果您仔细观察后可能还会再添加一些新模式”,这套软件就太大了,无法回答这个问题
Pete Kirkham

4
@Pete,好吧,也许您是对的,但与此同时,我还没有深入了解内核,我对应用程序的表面很感兴趣,例如在UIViewController使用MVC实现的iOS中(UIViewController是控制器,其根UIView是view) ,UIApplication使用具有Application Delegate的代理作为代理,等等...
Burjua 2011年

3
我认为您应该真正从头开始学习Android,而不要尝试将您的知识从iOS移植到Android。那里有很多很棒的书。Apress做一堆。如果您了解android中的应用程序和服务生命周期,则应该能够获得正确设计应用程序的方法。
blindstuff 2011年


这可能会有所帮助:stackoverflow.com/a/49694378
Ali Nem '18

Answers:


323

我尝试同时使用模型视图控制器(MVC)和模型视图呈现器架构模式进行android开发。我的发现是模型-视图-控制器工作正常,但是有一些“问题”。这一切都取决于您对Android Activity类的看法。是控制器,还是视图?

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

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

在MVC中,控制器应该是主要的入口点。如果将其应用到Android开发中,情况确实值得商de,因为该活动是大多数应用程序的自然切入点。

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

  • 充当入口点
  • 渲染组件
  • 将用户事件路由到演示者

这使您可以像这样实现模型:

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

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

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

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

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


14
好答案!我仍然有疑问:1.活动=查看,我正确了吗?2.您是将演示者实现为自己的公共类还是Activity的内部类?还是片段(也是内部类)?3.您是说在活动(视图)中使用传递类代替实际模型类吗?
2011年

14
1.是的,我将它们用作MVP模式中的视图。2.就我个人而言,我将其划分为各个公共班级,但是我想这是个人喜好:) 3.我对此解释得很差,“转发所需的班级”一词具有误导性。我的意思是,演示者位于视图和模型之间,它读取模型然后更新视图。我将更新我的答案以使其更加清楚:)
JustDanyul

感谢您抽出
宝贵

11
我实际上真的很喜欢Android开发,因为它是高度分离的。我如何使用MVC:将活动仅用于用户IO,并将本地服务用于所有处理。当服务要显示某些内容时-将其广播到您的活动中!当其他开发人员过多地处理活动时,我真的很讨厌它。
某处某人2014年

8
@SomeoneSomewhere为什么没有在单独的线程/ AsyncTasks中处理此类内容的类,为什么要提供服务?
2014年

87

2018年11月更新

在Android上有关MVC和MVP的博客上工作了几年之后(请参阅下面的答案正文),我决定以一种更全面,更易于理解的形式来获取我的知识和理解。

因此,我发布了有关Android应用程序体系结构的完整视频课程。因此,如果您有兴趣掌握Android开发中最先进的架构模式,请在此处查看此综合课程

此答案已更新,以便在2016年11月之前仍然有效


看来您是在寻找建筑模式而不是设计模式

设计模式旨在描述程序员为处理特定的一组重复发生的软件任务而可能实施的一般“技巧”。例如:在OOP中,当需要一个对象将某些事件通知一组其他对象时,可以采用观察者设计模式

由于Android应用程序(以及大多数AOSP)都是用Java编写的,Java是面向对象的,因此我想寻找一个单一的OOP设计模式会很困难,而这种模式在Android上是不使用的。

另一方面,体系结构模式不解决特定的软件任务-它们旨在根据相关软件组件的用例为软件组织提供模板

听起来有些复杂,但是我希望可以通过一个示例来阐明:如果使用某些应用程序从远程服务器获取数据并以结构化的方式将其呈现给用户,则MVC可能是一个不错的考虑对象。请注意,我没有对应用程序的软件任务和程序流程进行任何说明-我只是从用户的角度对其进行描述,然后出现了一种架构模式的候选人。

由于您在问题中提到MVC,所以我猜想您正在寻找架构模式。

在此处输入图片说明


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

但是今天情况有所不同-Google最近发布了数据绑定库,该与Android Studio完全集成,甚至为Android应用程序推出了一套体系结构蓝图

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

由于已经正式开始寻找适用于Android的最佳架构模式的事实,我认为我们将看到更多的想法。在这一点上,要预测哪种模式(或多种模式)将来成为行业标准确实是不可能的-我们将需要拭目以待(我猜大概需要一两年的时间)。

但是,我可以高度自信地做出一个预测:数据绑定库的使用不会成为行业标准。我有把握地说,因为数据绑定库(在其当前实现中)可带来短期的生产率提高和某种体系结构指导,但从长远来看,它将使代码不可维护。一旦该库的长期影响浮出水面,它将被废弃。


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

这个MVC不仅在外观上与其他MVC不同,它还基于一个理论,即Android中的Activity不是UI Elements,这对代码组织有着巨大的影响。

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


2
提供此类资源做得很好!谢谢!
Aleksandar

1
非常有用的链接!
Semaphor

我喜欢你的视频课程!谢谢
维克多·阿波扬

79

在此处输入图片说明

当我到达此职位时,它确实帮助我理解了带有示例的模式,因此我在下表中进行了说明,以清楚地看到Android Framework中的设计模式及其示例。

希望对您有所帮助。


3
编辑您的信息,并将实际内容显示为文本而不是屏幕截图。其他人则无法从您的图片中复制和粘贴内容,也无法帮助您解决输入错误。有关详细信息,请参见此处。谢谢。


1
谢谢您的回答,我对建筑模式和设计模式感到困惑,我还有一个问题是什么是oo-design and development !?@Peter Walter
Rucha Bhatt Joshi

我对这个答案投了赞成票,因为尽管@Burjua的问题是通过引用体系结构来提及设计模式的,但是它们并不相同。我认为这个答案对原始问题非常
有益,

事件总线使用发布者和订阅者设计模式
Devrath,

48

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

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

5
能否请您分享链接(引用)
shanraisshan

请分享参考,以便我可以找到更多有关它的信息。谢谢
Syed Hamza Hassan

27

这是一篇关于Android通用设计模式的好文章:

创作模式:

  • 生成器(例如AlertDialog.Builder
  • 依赖注入(例如Dagger 2
  • 辛格尔顿

结构模式:

  • 适配器(例如RecyclerView.Adapter
  • 外墙(例如翻新

行为模式:

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

1
这篇文章的重点是很好。
Maxim G

尽管从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
巴尔加夫饶

事件总线使用发布者和订阅者设计模式
Devrath,

16

以下Android类使用设计模式

1)视图持有人使用Singleton设计模式

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

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

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

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

6)Media FrameWork使用立面设计模式


11

Notifications情况下,NotificationCompat.Builder使用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);

3
这实际上是Builder模式。
Piovezan

@Piovezan我错了。谢谢你纠正我。我认为这是Decorator Pattern的简单版本。
杰夫T.

6

Android还使用ViewHolder设计模式。

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

ViewHolder设计模式使您无需查找即可访问每个列表项视图,从而节省了宝贵的处理器周期。特别地,它避免了ListView滚动期间对findViewById()的频繁调用,这将使其变得流畅。


5

所有这些模式,MVC,MVVM,MVP和演示模型)都可以应用于Android应用程序,但是如果没有第三方框架,就很难获得井井有条的结构和简洁的代码。

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

目前,如果没有第三方框架,您通常会有很多代码(例如addXXListener(),findViewById()等)不会增加任何业务价值。而且,您必须运行Android单元测试,而不是常规的JUnit测试,这需要花一些时间才能运行,并且使单元测试有些不切实际。

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



1

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

示例:IntentService类的设计。

IntentService接收Intent,启动工作线程并停止服务,所有请求均在单个工作线程上处理。


0

活页夹使用“观察者模式”的死亡收件人通知。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.