模板方法模式

protected abstract void primitiveOperation1();

protected abstract void primitiveOperation2();

private void concreteOperation() {

//这里是公共不变的部分

}

}

public class ConcreteTemplate extends AbstractTemplate {

@Override

protected void primitiveOperation1() {

//子类实现算法中的具体步骤

}

@Override

protected void primitiveOperation2() {

//子类实现算法中的具体步骤

}

}

public class Client {

public static void main(String[] args) {

AbstractTemplate template = new ConcreteTemplate();

template.templateMethod();

}

}

模板方法的实现非常简单,看上去就是简单的继承。但是模板方法必须是由父类定义一系列步骤,由子类去实现特定步骤。一系列步骤的方法被称为基本方法或者原语操作,需要由子类实现的方法都是protected的,这符合迪米特法则,外部知道的越少越好。模板方法可以说在实际当中是经常被用到的,不过多数情况下我们并没有感觉到。

模板方法中的钩子方法

模板方法的一个重要应用就是钩子方法(Hook Method)的应用,钩子方法给你提供了更加灵活的方式,使得你可以选择需要或者不需要执行算法步骤当中的某些步骤。

示例代码:

public abstract class AbstractTemplate {

/**

  • 模板方法, 定义一个算法骨架,包含一系列算法步骤

*/

public void templateMethod(){

//算法步骤由一些基本方法组成, 某些方法可以在子类中实现

primitiveOperation1();

primitiveOperation2();

//根据钩子方法的返回结果决定是否执行下面的步骤

if (hookMethod()) {

concreteOperation();

}

}

protected abstract void primitiveOperation1();

protected abstract void primitiveOperation2();

private void concreteOperation() {

//这里是公共不变的部分

}

/**

  • 钩子方法, 这里提供默认实现

*/

protected boolean hookMethod() {

return true;

}

}

public class ConcreteTemplate extends AbstractTemplate {

@Override

protected void primitiveOperation1() {

//子类实现算法中的具体步骤

}

@Override

protected void primitiveOperation2() {

//子类实现算法中的具体步骤

}

@Override

protected boolean hookMethod() {

//返回false, 那么将不会执行父类中的某些特定步骤

return false;

}

}

可以看到,子类中可以选择覆写hookMethod()改变返回值来达到控制是否执行特定步骤的目的,甚至,如果你需要,你都可以用钩子函数控制它们的执行顺序。这里的钩子函数hookMethod()在基类中提供了默认实现,返回true, 当然你也可以将钩子函数完全定义成abstract的,指定必须由子类来实现它。这要根据你的实际需求来,看你的基类需不需要默认的实现。

好莱坞原则

别调用我们,我们会调用你。

(Don’t call me, I will call you! 别打电话给我,我会打电话给你! )

这个原则是在《HeadFirst设计模式》中提到出的,感觉非常有趣,它形象的描述了模板方法的核心思想。

好莱坞原则可以给我们一种防止“依赖腐败”的方法。当高层组件依赖低层组件,而低层组件又依倾高层组件,而高层组件又依赖边侧组件,而边侧组件又依赖低层组件时,依赖腐败就发生了。在这种情况下,没有人可以轻易地搞懂系统是如何设计的。

在好莱坞原则之下,我们允许低层组件将自己挂钩到系统上,但是高层组件会决定什么时候和怎样使用这些低层组件。换句话说,高层组件对待低层组件的方式是“别调用我们,我们会调用你”。

文末

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。

当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。

进阶学习视频

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)


《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!
整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-PTT2G5ee-1715333112900)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》点击传送门,即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值