Android开发中的MVP架构Word文档格式.docx
- 文档编号:19835999
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:10
- 大小:205.39KB
Android开发中的MVP架构Word文档格式.docx
《Android开发中的MVP架构Word文档格式.docx》由会员分享,可在线阅读,更多相关《Android开发中的MVP架构Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
如果一个类需要花费时间从其他类中通过Get()和Set()检索数据(也就是说,需要深入业务并且告诉它们如何去做),所以是否应该把这些功能函数更好的组织到其它类而不是上帝类中。
(Riel1996)
上帝类的维护成本很高,你很难理解正在进行的操作,并且难以测试和扩展,这就是为什么要避免创建上帝类的黄金法则。
然而,在Android开发中,如果你不考虑架构的话,Activity类往往会越来越大。
这是因为,在Android中,允许View和其它线程共存于Activity内。
其实最大的问题莫过于在Activity中同时存在业务逻辑和UI逻辑。
这会增加测试和维护的成本。
Activity是上帝
这是为什么需要清晰架构的原因之一。
不仅会造成Activity的臃肿,还会引起其他问题,如使Activity和Fragment的生命周期变复杂,以及数据绑定等。
什么是MVP?
MVP代表Model,View和Presenter。
∙View层负责处理用户事件和视图部分的展示。
在Android中,它可能是Activity或者Fragment类。
∙Model层负责访问数据。
数据可以是远端的ServerAPI,本地数据库或者SharedPreference等。
∙Presenter层是连接(或适配)View和Model的桥梁。
下图是基于MVP架构的模式之一。
View是UI线程。
Presenter是View与Model之间的适配器。
UseCase或者Domain在Model层中,负责从实体获取或载入数据。
依赖规则如下:
TheDependencyInjection
关键是,高层接口不知道底层接口的细节,或者更准确地说,高层接口不能,不应该,并且必须不了解底层接口的细节,是(面向)抽象的,并且是细节隐藏的。
Thehigherinterfacesdonotknowaboutthedetailsofthelowerones
依赖规则?
UncleBob的“TheCleanArchitecture”描述了依赖的规则是什么。
同心圆将软件划分为不同的区域,一般的,随着层级的深入,软件的等级也就越高。
外圆是实现机制,内圆是核心策略。
这是上面片文章的摘要:
Enitities:
∙可以是一个持有方法函数的对象
∙可以是一组数据结构或方法函数
∙它并不重要,能在项目中被不同应用程序使用即可
UseCases
∙包含特定于应用程序的业务规则
∙精心编排流入Entity或从Entity流出的数据
∙指挥Entity直接使用项目范围内的业务规则,从而实现UseCase的目标
PresentersControllers
∙将UseCase和Entity中的数据转换成格式最方便的数据
∙外部系统,如数据库或网页能够方便的使用这些数据
∙完全包含GUI的MVC架构
ExternalInterfaces,UI,DB
∙所有的细节所在
∙如数据库细节,Web框架细节,等等
MVC,MVP还是MVVM?
那么,哪一个才是最好的呢?
哪一个比其他的更优秀呢?
我能只选择一个吗?
答案是,NO。
这些模式的动机都是一样的。
那就是如何避免复杂混乱的代码,让执行单元测试变得容易,创造高质量应用程序。
就这样。
当然,远不止这三种架构模式。
而且任何一种模式都不可能是银弹,他们只是架构模式之一,不是解决问题的唯一途径。
这些只是方法、手段而不是目的、目标。
利与弊
OK,让我们回到MVP架构上。
刚刚我们了解了什么是MVP,讨论了MVP以及其它热门架构,并且介绍了MVC,MVP和MVVM三者间的不同。
这是关于MVP架构利与弊的总结:
**利
∙可测试(TDD)
∙可维护(代码复用)
∙容易Reviewe
∙信息隐蔽
**弊
∙冗余的,尤其是小型App开发
∙(有可能)额外的学习曲线
∙开始编写代码之前需要时间成本(但是我敢打赌,设计架构是所有项目开发所必需的)
showmethecode!
这里仅展示了MVP模式的一小段结构。
如果你想了解更多项目或生动的代码示例,请参考文章末尾的“链接和资源”。
那里有非常丰富和设计巧妙的示例,基本都托管在Github上,以便你能clone,在设备上运行,并了解工作原理。
首先,为每一个View定义接口。
1./**
2.
*
Interface
classes
for
the
Top
view
3.
*/
4.public
interface
TopView
{
5.
6.
/**
7.
Initialize
view.
8.
9.
e.g.
facade-pattern
method
handling
all
Actionbar
settings
10.
11.
void
initViews();
12.
13.
14.
Open
{<
a
href="
DatePickerDialog}
15.
16.
openDatePickerDialog();
17.
18.
19.
Start
ListActivity
20.
21.
startListActivity();
22.}
让我们重写TopView类,要点如下:
∙TopActivity只是负责处理事件监听或者展示每个视图组件
∙所有的业务逻辑必须委托给Presenter类
∙在MVP中,View和Presenter是一一对应的(在MVVM中是一对多的)
1.public
class
TopActivity
extends
Activity
implements
//
here
we
use
ButterKnife
to
inject
views
4.
Calendar
Title
@Bind(R.id.calendar_title)
TextView
mCalendarTitle;
private
TopPresenter
mTopPresenter;
@Override
protected
onCreate(Bundle
savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_top);
ButterKnife.bind(this);
Save
instance
in
meber
variable
field
mTopPresenter
=
new
TopPresenter();
mTopPresenter.onCreate(this);
}
22.
23.
/*
24.
Overrides
from
TopView}
interfaces
25.
26.
27.
28.
public
initViews()
29.
settins
30.
31.
set
event
listeners
32.
33.
34.
35.
openDatePickerDialog()
36.
DatePickerFragment.newInstance().show(getSupportFragmentManager(),
37.
DatePickerFragment.TAG);
38.
39.
do
not
write
logic
here...
must
be
passed
Presenter
40.
mTopPresenter.updateCalendarDate();
41.
42.
43.
44.
startListActivity()
45.
startActivity(new
Intent(this,
ListActivity.class));
46.
47.}
这是Presenter类,最重要的一点是Presenter仅仅是连接View与Model的适配桥梁。
比如,TopUseCase#saveCalendarDate()是对TopPresenter细节隐藏的,同样对TopView也是如此。
你不需要关心数据结构,也不需要关心业务逻辑是如何工作的。
因此你可以对TopUseCase执行单元测试,因为业务逻辑与视图层是分离的。
@Nullable
mView;
TopUseCase
mUseCase;
TopPresenter()
mUseCase
TopUseCase();
onCreate(@NonNull
topView)
mView
topView;
you
call
View'
s
implemented
methods
mView.initViews();
updateCalendarDate()
forget
return
if
instances
is
null
(mView
==
null)
return;
comes
String
dateToDisplay
mUseCase.getDateToDisplay(mContext.getResources());
mView.updateCalendarDate(dateToDisplay);
save
date,
and
this
hidden
UseCase
mUseCase.saveCalendarDate();
32.}
当然,尽管业务逻辑被实现在Activity类中,你依然可以执行单元测试,只不过这会耗费很多时间,而且有些复杂。
可能需要更多的时间来运行App,相反,你本应该充分利用测试类库的性能,如Robolectric。
总结
这里没有万能药,而且MVP也仅仅是解决方案之一,它可以与其他方法协同使用,同样,也可以有选择的用于不同项目。
【编辑推荐】
1.AndroidStudio+smalidea进行smail动态调试
2.Android应用内存泄漏的定位、分析与解决策略
3.基于JavaSocket的自定义协议,实现Android与服务器的长连接
(一)
4.基于JavaSocket的自定义协议,实现Android与服务器的长连接
(二)
5.34个Android常用adbshell命令汇总
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 开发 中的 MVP 架构