设计模式:模板方法
2017-01-03 22:14
453 查看
模板方法
使用基类定义整体步骤,即若干方法的调用过程,将一些可变的步骤由子类去重写。这样就可以利用多态在不改变操作的整体结构下定制一些特殊细节。代码解释
可以联想在线电子邮件和普通邮递的区别。基类定义操作过程的整体结构:
abstract class BaseProcedure { public final void proceed() { step1(); step2(); } public abstract void step1(); public abstract void step2(); }
子类根据需要定制某些步骤:
class OnlineProcedure extends BaseProcedure { @Override public void step1( //在线过程1 ) @Override public void step2() { //在线过程2 } }
案例
Activity
Activity类定义了生命周期的各种回调:final void performCreate(Bundle icicle) { ... onCreate(icicle) ... } final void performStart() { ... onStart(); ... } final void performResume() { ... onResume(); ... } protected void onCreate(@Nullable Bundle savedInstanceState); protected void onStart(); protected void onResume();
perform**()系列方法分别调用了对应的
on**()方法,目标方法在调用子类重写的方法时通常做了很多额外准备工作和后续工作。
View绘制
view绘制的整体过程:三大阶段是固定的,子类完成各个部分细节。同Activity一样:
public final void measure(int widthMeasureSpec, int heightMeasureSpec) { ... onMeasure(widthMeasureSpec, heightMeasureSpec); ... } public void layout(int l, int t, int r, int b) { ... onLayout(changed, l, t, r, b); ... } public void draw(Canvas canvas) { ... // Step 3, draw the content if (!dirtyOpaque) onDraw(canvas); ... }
ViewGroup事件分发
ViewGroup在方法dispatchTouchEvent()中定义了事件分发机制的整体结构。子类需要重写以下方法来定制事件处理过程:
public boolean onInterceptTouchEvent(MotionEvent ev); public boolean onTouchEvent(MotionEvent event);
用途
把公共不变的行为抽取到基类。一方面是基类代码复用,另一方面,基类定义了整体结构,而细节只能是子类去完成的操作。
模板方法强调抽象过程的不变性,某些细节的可变性。
(本文使用Atom编写)
相关文章推荐
- 外观模式(门面模式)---脸有时比才华更重要
- Spring Cloud Config
- mysql 5.5.32 多实例环境的启动问题
- SpannableString属性详解
- java的IO流----将多个拆分的子文件合并为一个目标文件
- 利用 Spring MVC 上传多文件到指定目录 spring upload files
- swift中添加模糊图片
- commons-csv的基本操作
- vue2.0实践的一些细节
- plsql11.06注册码
- ChatSecure
- JAVA中this用法小结
- 简单FTP服务器搭建教程
- 线性代数复习分析(线性方程组)
- Flask学习总结笔记(7) -- 程序文件组织结构
- 错误 1 error C1189: #error : gl.h included before glew.h
- 流水作业调度问题
- BZOJ2879: [Noi2012]美食节
- getBoundingClientRect的用法
- 人脸识别(Face Recognition)相关