Launcher中采用的设计模式
2015-08-25 22:59
309 查看
Launcher总体采用了MVC模式,具体的介绍摘自别人博客的一段
转载自ANDROID2.3 Launcher源码分析-MVC
Launcher从总体架构上来看采用了MVC模式。其中Launcher.java为控制器,LauncherModel为模型;XML界面配置文件为视图,其中Workspace为视图容器。模型中操作数据库模型,保持数据模型和数据库的一致。控制器同步视图和模型,视图和模型之间不直接关联,通过唯一通过控制器发生关联。
举个例子,当Gallery.apk应用被删除时,数据模型(LauncherModel)接收到ACTION_PACKAGE_REMOVED消息,然后在消息处理中,从数据模型中删除该应用的信息,从数据库记录中删除该应用的信息,然后通过回调(Callbacks)去更新视图(Workspace),而这个回调就是在Launcher中实现的。(LauncherModel——>Launcher(回调)——>Workspace)
再举一个例子,当Gallery应用移动位置时,假设有空位置可以移动,Gallery应用从原位置移动到目标位置过程。View处理移动事件,Controller 将DragTarget设置为数据模型(LauncherModel)。所以最终触发数据模型的放置动作,数据判断有无空位置放置,如果有成功放置,更新该应用的数据模型和数据库记录。 (Workspace——>Launcher(回调)——>LauncherModel)
那能不能将Launcher从MVC模式变更到MVP模式呢?如果可以的话,该怎么变更呢?
先对比一下MVC、MVP
参考这篇文章Android MVP 探究与总结
MVC:
MVP:
通过与MVP结构图对比着看可以发现:
在MVC结构中,Model是可以直接被View操作的。其实这就是MVP与MVC最大的一个区别。
MVP有什么用?
或者可以这样问MVP有什么好处?为什么要使用MVP?
其实通过上面的几张图就不难看出
- MVP抽离了显示层和逻辑层,降低了耦合
- MVP结构层次更清晰,可以轻易实现View替换却不带动逻辑层变动。
- MVP逻辑层是针对接口编程,他更方便于进行单元测试。
其实,说这么多,都是因为显示层与逻辑层分离带来地便利。
都说MVP抽离了层结构,降低了耦合度,那么它到离是如何抽离的?当然是通过接口了。Java中interface的理解以及定义的初衷,无非是考虑三点:
这三点明确了,就比较容易理解这MVC,MVP的设计模式了。
再来看看Launcher的Workspace(V)和LauncherModel(M)是否有耦合的关系,我们好将其进行分离。
在Launcher.java中,使用接口封装View,让Model层在Presenter中通过View的接口,访问Workspace和Hottest,这么做有什么意义呢?其实一点意义也没有,MVP是为了隔离Model和View之间的关联,只有在View足够复杂,需要分开进行开发的时候,引入设计模式,才会有意义。
转载自ANDROID2.3 Launcher源码分析-MVC
Launcher从总体架构上来看采用了MVC模式。其中Launcher.java为控制器,LauncherModel为模型;XML界面配置文件为视图,其中Workspace为视图容器。模型中操作数据库模型,保持数据模型和数据库的一致。控制器同步视图和模型,视图和模型之间不直接关联,通过唯一通过控制器发生关联。
举个例子,当Gallery.apk应用被删除时,数据模型(LauncherModel)接收到ACTION_PACKAGE_REMOVED消息,然后在消息处理中,从数据模型中删除该应用的信息,从数据库记录中删除该应用的信息,然后通过回调(Callbacks)去更新视图(Workspace),而这个回调就是在Launcher中实现的。(LauncherModel——>Launcher(回调)——>Workspace)
再举一个例子,当Gallery应用移动位置时,假设有空位置可以移动,Gallery应用从原位置移动到目标位置过程。View处理移动事件,Controller 将DragTarget设置为数据模型(LauncherModel)。所以最终触发数据模型的放置动作,数据判断有无空位置放置,如果有成功放置,更新该应用的数据模型和数据库记录。 (Workspace——>Launcher(回调)——>LauncherModel)
那能不能将Launcher从MVC模式变更到MVP模式呢?如果可以的话,该怎么变更呢?
先对比一下MVC、MVP
参考这篇文章Android MVP 探究与总结
MVC:
MVP:
通过与MVP结构图对比着看可以发现:
在MVC结构中,Model是可以直接被View操作的。其实这就是MVP与MVC最大的一个区别。
MVP有什么用?
或者可以这样问MVP有什么好处?为什么要使用MVP?
其实通过上面的几张图就不难看出
- MVP抽离了显示层和逻辑层,降低了耦合
- MVP结构层次更清晰,可以轻易实现View替换却不带动逻辑层变动。
- MVP逻辑层是针对接口编程,他更方便于进行单元测试。
其实,说这么多,都是因为显示层与逻辑层分离带来地便利。
都说MVP抽离了层结构,降低了耦合度,那么它到离是如何抽离的?当然是通过接口了。Java中interface的理解以及定义的初衷,无非是考虑三点:
1. 接口由谁实现 2. 接口给谁回调 3. 接口函数中更改了谁的状态
这三点明确了,就比较容易理解这MVC,MVP的设计模式了。
再来看看Launcher的Workspace(V)和LauncherModel(M)是否有耦合的关系,我们好将其进行分离。
interface LauncherViewInterface { public Workspace getWorkspace(); public Hotseat getHostseat(); } interface LauncherModelInterface { public void startLoader(); } public LauncherPresenter implements LauncherModeInterface { public startLoader() { mLauncherModel.startLoader(); } } class Launcher implements LauncherModelInterface { private Workspace mWorkspace; priavte Hotseat mHotseat; public void onCreate() { mWorkspace = (Workspace)this.findViewById.... mHotseat = (Hotseat)this.findViewById... } public Workspace getWorkspace() { return mWorkspace; } public Hotseat getHostseat() { return mHotseat; } }
在Launcher.java中,使用接口封装View,让Model层在Presenter中通过View的接口,访问Workspace和Hottest,这么做有什么意义呢?其实一点意义也没有,MVP是为了隔离Model和View之间的关联,只有在View足够复杂,需要分开进行开发的时候,引入设计模式,才会有意义。
相关文章推荐
- vmware vm tools下载地址
- [LeedCode OJ]#154 Find Minimum in Rotated Sorted Array II
- NPOI以及在ASP.NET MVC中的使用
- [Effective Java 读书笔记] 第二章 创建和销毁对象 第六-七条
- usaco Your Ride Is Here
- 线程
- 我走向夜
- subprocessing在python中的应用
- 准备准备..
- 互斥的实例和使用场景
- 1.大数据基础(上)_3.大数据处理技术
- pat(B) 1027. 打印沙漏(输入输出)
- javadoc中文档注释标记的使用
- PreTranslateMessage DoModal() ASSERT(::IsWindow(m_hWnd)
- [学习笔记]线性表的链式存储
- [leetcode] 117.Populating Next Right Pointers in Each Node II
- [LeedCode OJ]#48 Rotate Image
- UVA - 658 It's not a Bug, it's a Feature! (隐式图的最短路,位运算)
- TCP/IP协议
- stack 的入门