android 架构学习笔记
初识 android 架构
工作了一年多,做的主要是功能上的开发,一直对 android 的架构设计上抱有好奇心。最近之前带我的开发大哥慢慢转变了方向,我也需要尽快学习 android 架构设计,在这里我会持续的分享一些自己学习或者使用的心得,欢迎大家提出宝贵的建议并一同讨论!
MVC 架构:表现层分离
MVC 的分层和职责
MVC 即 Model-View-Controller,是一种经典的三层软件体系架构,在此架构下,软件的 UI/UX 界面会和逻辑层分离,从而提高代码的可读性与可维护性。
标准的 MVC 框架模式下,各层的职责如下
- Model 层:模型层,负责数据处理,包括网络数据与持久化数据的获取、加工等等,在 android 中典型实现未数据结构的定义类
- View 层:视图层,负责处理界面绘制,展示数据,并对用户产生交互反馈等,在 android 上的典型实现一般为 activity/fragment 等
- Controller 层:控制器层,负责处理业务逻辑
在 MVC 架构中,Controller 和 View 都依赖于 Model,架构通过 Controller 来更新数据,通过 View 来展示数据,MVC 架构如下图所示:
MVC 在移动开发中的问题
在 android 开发中, MVC 架构经常因其开发者的争议,一般都是由 activity 在 MVC 中的职责引起的。
Activity 在 Google 提供的文档中的定义是
An activity is a single, focused thing that the user can do. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View). While activities are often presented to the user as full-screen windows, they can also be used in other ways: as floating windows (via a theme with R.attr.windowIsFloating set), Multi-Window mode or embedded into other windows.
Activity 是一个独立的,用户可以专注的事件。 几乎所有 Activity 都会与用户交互,因此 Activity 类负责为您创建一个窗口,您可以在其中放置带有 setContentView(View)的UI。 尽管 Activity 通常以全屏窗口的形式呈现给用户,但它们也可以以其他方式使用:作为浮动窗口(通过具有R.attr.windowIsFloating设置的主题),多窗口模式或嵌入到其他窗口中。
Activity 的在 MVC 的职责在不同的开发者手中是不一样的,只要它可以解决实际的问题,便是正确的。
MVC 的模式
被动模式
绝大部分的 MVC 架构的设计者使用的是此模式,这里的被动,指的是 Model 层的被动。
被动模式下, Model 不会主动将它的变化发给 View 进行更新,而是通过 Controller 通知 View 进行相应的更新,而且只有 Controller 才能对 Model 进行更新。
主动模式
在 Web 端,传统意义上的 MVC 是主动模式的,而对于移动端,在处理一些数据变化频繁的场景下,可以应用 MVC 的主动模式。
主动模式指 Model 层的主动,它会通知 View 层进行更新。主动模式使用了观察者模式,View 为观察者,Model 为被观察者。
观察者模式
观察者模式是一种阮家的设计模式,定义了对象之间一种一对多的关系。当一个对象发生变化,所有依赖它的对象都将会收到通知。
主动与被动模式的区别
被动模式与主动模式相比,缺点主要是 View 无法感知 Model 的变化,需要 Controller 间接的进行通知。同时,这也是一个优点,Controller 可以更好的控制 View 的更新而无需担心 Model 主动更新变化而产生同步相关的问题。
MVC 的核心思想
MVC 的核心思想是表现层分离,即将领域模型与视图模式进行分离。Model 即为领域模型,而 View-Controller 协作即为视图模型。
小结
今天大概了解了 MVC 的主体思想与两种模式,后续将通过代码实战的形式进行深入了解学习。
代码实战 (除了有两个布局没有完成)
https://github.com/rookiezed/MVC-Learn.git