android 模板方法模式,Android设计模式系列--模板方法模式

模板方法,和单例模式是我认为GOF的23中最简单的两种模式。

但是我个人对模板方法的经典思想特别推崇,虽然模板方法在大对数情况下并不被推荐使用,但是这种通过父类调用子类的方法,使用继承来改变算法的一部分,是面向对象的一种基本认识。

打比方说父亲有很多理想,就行医救人吧,但是父亲医术不行,只能靠儿子,儿子长大后遵从父亲大志,春风拂面,妙手回春,实现了父亲的理想,儿子做的事情早在出生前就定下来了,是父亲之前久定好的模板。

认识到模板方法的这种思想,父类可以让未知的子类去做它本身可能完成的不好或者根本完成不了的事情,对框架学习大有帮助。

本文以View中的draw方法为例,展开分析。

模板方法,TemplateMethod,光是学习这个模式,就会对你产生长远影响的一个模式。

1.意图

定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

热门词汇:骨架 步骤 结构 延迟到子类

2.结构

cccdd82b483db81d5bed4b1dbd2ff571.png

定义了几个步骤1,2,3等,在模板方法中按照一定的结构顺序执行这些步骤。父类的方法可以有缺省实现,也可以是一个空实现,即所谓的钩子操作。

结合实际情况,我们画出View中draw方法涉及到的几个步骤方法如下:

5c004df310517ee695acfa98a1f3135e.png

学习模板方法对于我们了解框架的基类实现,生命周期和流程控制非常有帮助,我觉得是务必要掌握的一个模式。

3.代码

publicclassView{

/**

* 钩子操作,空实现

*/

protectedvoidonDraw(Canvas canvas) {

}

/**

*钩子操作,空实现

*/

protectedvoiddispatchDraw(Canvas canvas) {

}

//算法骨架

publicvoiddraw(Canvas canvas) {

if(!verticalEdges && !horizontalEdges) {

// 步骤1

if(!dirtyOpaque) onDraw(canvas);

// 步骤2

dispatchDraw(canvas);

// 步骤3

onDrawScrollBars(canvas);

return;

}

}

//... ...

}

我们看看系统组件TextView的实现:

publicclassTextView{

@Override

protectedvoidonDraw(Canvas canvas) {

//大量自定义实现代码

}

}

如果我们自定义View的话,我们一般也是重写onDraw方法即可:

publicclassMyViewextendsView {

publicMyView(Context context) {

super(context);

}

@Override

protectedvoidonDraw(Canvas canvas) {

super.onDraw(canvas);

}

@Override

protectedvoiddispatchDraw(Canvas canvas) {

super.dispatchDraw(canvas);

}

}

4.效果

(1).模板方法是一种代码复用的基本技术。它们在类库中尤为重要,它们提取了类库中的公共行为。

(2).模板方法导致一种方向控制结构,"好莱坞法则":"Don't call me,i will call you.",即一个父类调用子类的操作,而不是相反。

(3).模板调用操作的类型有具体的操作,具体的AbstracClass操作,原语操作,工厂方法,钩子操作。少定义原语操作。

(4).android中对这些重定义操作的命名喜欢在方法前加一个前缀on。

(5).模板方法使用继承来改变算法的一部分。策略模式使用委托来改变整个算法。

【编辑推荐】

【责任编辑:张叶青 TEL:(010)68476606】

点赞 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值