模板方法,和单例模式是我认为GOF的23中最简单的两种模式。
但是我个人对模板方法的经典思想特别推崇,虽然模板方法在大对数情况下并不被推荐使用,但是这种通过父类调用子类的方法,使用继承来改变算法的一部分,是面向对象的一种基本认识。
打比方说父亲有很多理想,就行医救人吧,但是父亲医术不行,只能靠儿子,儿子长大后遵从父亲大志,春风拂面,妙手回春,实现了父亲的理想,儿子做的事情早在出生前就定下来了,是父亲之前久定好的模板。
认识到模板方法的这种思想,父类可以让未知的子类去做它本身可能完成的不好或者根本完成不了的事情,对框架学习大有帮助。
本文以View中的draw方法为例,展开分析。
模板方法,TemplateMethod,光是学习这个模式,就会对你产生长远影响的一个模式。
1.意图
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
热门词汇:骨架 步骤 结构 延迟到子类
2.结构
定义了几个步骤1,2,3等,在模板方法中按照一定的结构顺序执行这些步骤。父类的方法可以有缺省实现,也可以是一个空实现,即所谓的钩子操作。
结合实际情况,我们画出View中draw方法涉及到的几个步骤方法如下:
学习模板方法对于我们了解框架的基类实现,生命周期和流程控制非常有帮助,我觉得是务必要掌握的一个模式。
3.代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
public class View{
/**
* 钩子操作,空实现
*/
protected void onDraw(Canvas canvas) {
}
/**
*钩子操作,空实现
*/
protected void dispatchDraw(Canvas canvas) {
}
//算法骨架
public void draw(Canvas canvas) {
if (!verticalEdges && !horizontalEdges) {
// 步骤1
if (!dirtyOpaque) onDraw(canvas);
// 步骤2
dispatchDraw(canvas);
// 步骤3
onDrawScrollBars(canvas);
return ;
}
}
//... ...
} |
我们看看系统组件TextView的实现:
1
2
3
4
5
6
|
public class TextView{
@Override
protected void onDraw(Canvas canvas) {
//大量自定义实现代码
}
} |
如果我们自定义View的话,我们一般也是重写onDraw方法即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public class MyView extends View {
public MyView(Context context) {
super (context);
}
@Override
protected void onDraw(Canvas canvas) {
super .onDraw(canvas);
}
@Override
protected void dispatchDraw(Canvas canvas) {
super .dispatchDraw(canvas);
}
} |
4.效果
(1).模板方法是一种代码复用的基本技术。它们在类库中尤为重要,它们提取了类库中的公共行为。
(2).模板方法导致一种方向控制结构,"好莱坞法则":"Don't call me,i will call you.",即一个父类调用子类的操作,而不是相反。
(3).模板调用操作的类型有具体的操作,具体的AbstracClass操作,原语操作,工厂方法,钩子操作。少定义原语操作。
(4).android中对这些重定义操作的命名喜欢在方法前加一个前缀on。
(5).模板方法使用继承来改变算法的一部分。策略模式使用委托来改变整个算法。
相关推荐
Android设计模式是面向对象编程在Android开发中的应用,它源于《设计模式:可复用面向对象软件的基础》一书中的理论,并在Android SDK源码中得到了广泛应用。设计模式是为了解决软件工程中常见问题而提出的成熟解决...
在源码阅读方面,理解MVC、MVP或MVVM等设计模式对于分析Android应用的架构至关重要。同时,熟悉Android四大组件——Activity、Service、BroadcastReceiver和ContentProvider,以及Intent机制,也是深入理解源码的...
在Android应用开发中,创建一个...这个过程涵盖了Android UI设计、数据绑定、适配器模式以及用户交互等核心知识点。随着技能的提升,你还可以进一步优化界面,如添加下拉刷新、异步加载图片等功能,使应用更加完善。
2. **新建项目**:在Android Studio中创建新项目时,需要选择项目模板,设置项目名、包名、最小SDK版本等信息,这一步是所有Android应用开发的起点。 3. **Gradle构建系统**:Android Studio使用Gradle作为构建工具...
在Android应用开发中,计算器是一个常见的示例项目,它展示了如何使用Java或Kotlin语言以及Android SDK来构建用户界面和处理用户输入。本资源提供的"Android 计算器源码"是一个很好的学习材料,帮助开发者深入理解...
4. **电池管理**:手机卫士通常有电池电量监控和节能模式,源码可能展示了如何获取电池状态信息,并根据电量调整应用行为。 5. **网络管理**:这可能涉及到流量监控、WiFi管理、网络安全检测等功能。开发者可以通过...
8. **设计模式**:可能采用了MVP(Model-View-Presenter)或MVVM(Model-View-ViewModel)等设计模式来组织代码。 9. **第三方库集成**:可能包括支付接口SDK、地图API、日历API等第三方库的使用。 10. **测试与...
在Android开发领域,模仿成熟应用的用户界面(UI)是一种常见的学习方法,它能帮助开发者理解和掌握优秀的交互设计和编程技巧。"Android应用源码之高仿360云盘UI.zip"是一个针对Android开发者的资源,提供了实现类似...
在深入探讨Android源码之前,我们首先需要理解Android系统的架构层次。Android系统主要分为四个层次:应用程序层、应用程序框架...同时,理解源码也能帮助我们更好地遵循Android的设计原则,提高应用的兼容性和稳定性。
通过这个源码,开发者不仅可以学习到Android的广播接收器、权限管理、TTS服务的使用,还可以了解到如何设计和实现一个实用的功能。同时,这也是一个很好的实践案例,帮助开发者提升在实际项目中的问题解决能力。对于...
【Android-android-jobs.zip】这个压缩包文件显然与Android开发工作相关,可能包含了一系列的代码示例、项目模板或者是招聘需求。2018年的背景表明这些内容可能反映了当时Android开发的一些主流技术和趋势。 ...
在本资源中,我们收集了50个优秀的Android项目源码,这是一份对安卓开发者极其宝贵的资料库,尤其对于那些寻求提升技能、探索不同应用实现方式或学习新设计模式的人来说。这部分源码涵盖了各种类型的Android应用,...
通过研究《Android生活手册源码》,开发者不仅能学习到具体的技术细节,还能掌握良好的编程实践和设计模式,这对于成为一名专业的Android开发者来说是必不可少的。同时,这些源码也可以作为开发者的参考资料,遇到...
【Web网页设计制作-毕业设计期末大作业源码】(FZY031)微信系统分离出的手机网站模板首页(单页)是一个专为移动端设计的网站模板,旨在帮助学生进行毕业设计或期末大作业时,快速构建适应手机浏览的微信系统页面。...
在Android开发中,侧边栏导航(Sidebar Navigation)是一种常见的设计模式,用于提供应用程序的主要导航选项。这种设计通常包括一个可滑动的侧边栏,其中包含多个菜单项,用户可以点击这些菜单项来切换应用的不同...
### Android2.1源码结构分析 在深入探讨Android2.1源代码的结构之前,我们首先需要了解Android操作系统的基本架构。Android系统基于Linux内核,由Google开发,旨在为移动设备提供一个全面的软件平台。它包含了核心...
《安卓Android源码——荒村鬼话电子书源码》是一个专门为安卓平台开发的电子书应用的源代码,它提供了一个完整的解决方案,用于构建类似书籍阅读的应用程序。这个项目不仅对于开发者来说是一份宝贵的资源,也对学习...
4. **微信支付集成**:尽管标题提到“仿微信支付”,实际的支付功能需要接入微信官方的支付SDK,处理支付签名、订单创建、支付结果通知等环节。 5. **数据持久化**:可能使用uni-app的本地存储API或第三方库,保存...
本套源码主要涵盖了Java、Android、iOS以及小程序四个平台,构建了一个全面的B2B大型商城系统。这个系统的设计和实现涉及了多种技术栈和功能模块,旨在为用户提供一个跨平台、多用户级别的购物体验。 1. **Java后端...
总之,《Android 节日短信回复助手源码》项目展示了Android应用开发的基本流程,包括UI设计、事件处理、数据存储以及与其他Android组件的交互。对于想要学习Android开发或提升Android应用实践能力的开发者来说,这是...