模板模式我觉得在Android的开发中是最长用到的,基本是随处可见的,认识该模式,有助于我们对Android的源码及框架有一个更深层次的认识。那什么是模板模式呢,模板模式就是定义一个基本框架,将其中的一些方法延迟到子类中执行实现。就比如我们去餐馆吃饭,基本步骤肯定为找到座位,点菜,上菜,吃饭,买单五个过程,其中点菜这个过程是可变的,我们点的菜可多可少,其他都是固定的,那么我们就可以写在一个固定的抽象类里形成一个基本框架,我们的子类继承该抽象类,对其中可变的方法进行复写。

下面我们就来看一个例子。

/** 抽象基类,为所有子类提供一个算法框架* * 提神饮料*/
public abstract class RefreshBeverage {/** 制备饮料的模板方法* 封装了所有子类共同遵循的算法框架*/public final void prepareBeverageTemplate(){//步骤1 将水煮沸boilWater();//步骤2 泡制饮料brew();//步骤3 将饮料倒入杯中pourInCup();if(isCustomerWantsCondiments()){//步骤4 加入调味料addCondiments();}}/** Hook, 钩子函数,提供一个默认或空的实现* 具体的子类可以自行决定是否挂钩以及如何挂钩* 询问用户是否加入调料*/protected boolean isCustomerWantsCondiments() {return true;}/** 基本方法,将水煮沸*/private void boilWater() {System.out.println("将水煮沸");}/** 基本方法,将饮料倒入杯中*/private void pourInCup() {System.out.println("将饮料倒入杯中");}/** 抽象的基本方法,泡制饮料*/protected abstract void brew();/** 抽象的基本方法, 加入调味料*/protected abstract void addCondiments();}

我们定义了一个制备饮料的模板类,其中我们一定要注意prepareBeverageTemplate()方法的关键字一定为final,保证子类只能修改可见的方法,保证模板框架的稳定,需要子类实现的方法定义为Protected属性并且为一个抽象类,由子类来对其自由发挥,就像我们Android每一个类一般都会继承Activity类,复写其中的oncreate()方法一样,其属性也为protected.不想在子类可见的方法,我们需将其定位为private属性并且写好方法体。

我们还可以发现我们在其中定义了一个isCustomerWantsCondiments()方法,这个方法就是hook钩子,增加模板框架的灵活性,该方法可以在子类中重写,以此来判断是否需要执行某个方法。

public class Tea extends RefreshBeverage {@Overrideprotected void brew() {System.out.println("用80度的热水浸泡茶叶5分钟");}@Overrideprotected void addCondiments() {System.out.println("加入柠檬");}@Override/** 子类通过覆盖的形式选择挂载钩子函数* @see com.imooc.pattern.template.RefreshBeverage#isCustomerWantsCondiments()*/protected boolean isCustomerWantsCondiments(){return false;}}

我们写了一个泡茶的类,并将hook方法复写返回false, 取消了制备饮料的第四步。

那么我们什么时候需要使用模板类呢?

(1)算法或操作遵循相似的逻辑时

(2)重构时(把相同的代码抽入到父类中),提高程序的复用性

(3)重要复杂的算法,核心算法设计为模板算法

Android开发之模板模式初探相关推荐

  1. Android开发之策略模式初探

    策略模式主要定义一系列的算法,学过数据结构的朋友肯定知道,对于数组从大到小进行排序有着很多的算法,比如冒泡.交换.快速插入等等,策略模式就是把这些算法封装成一个个独立的类,方便使用时候进行任意的调用. ...

  2. Android开发之工厂模式初探

    工厂模式(Factory)是比较常见的一种模式我觉得也是一种非常容易理解的一种模式,举个简单的例子吧,我们小时候经常考试,每次最害怕的就是爸妈问考试试卷的分数,不同的分数我们的心情也是不一样的.那么我 ...

  3. Android开发之Buidler模式初探结合AlertDialog.Builder解说

          什么是Buidler模式呢?就是将一个复杂对象的构建与它的表示分离,使得相同的构建过程能够创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它同意用户能够仅仅通过指定复杂对象 ...

  4. Android开发之Buidler模式初探结合AlertDialog.Builder讲解

    什么是Buidler模式呢?就是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就 ...

  5. android开发适配深色模式,手机不支持深色模式,如何用软件解决深色模式的问题?(附有系统全局深色模式实现方法...

    本帖最后由 巷子口的你 于 2020-8-8 07:57 编辑 1.92允许通过设置为助手应用来饮捷切频深色模式(设置入口一般为系统默认应用-助手和语音输人, MIU需要设置为语音助手)提醒:稳定模式 ...

  6. Android开发中ViewHolder模式的复用写法一劳永逸哦

    今天给大家分享一个很实用的ViewHolder中的写法.这个大家肯定写adapter的时候是基本都会写的,主要是用来缓存控件,优化加载的效率. 很多时候,我们都是自定义一个adapter,然后继承Ba ...

  7. Android开发之——银联支付初探

    前言 现在网上支付用的比较多的是微信支付,支付宝支付和银联支付.关于微信和支付宝支付前面已经讲过了,本文主要介绍关于银联支付集成的过程和步骤. 银联支付 资源查找 集成文档 点击上面的集成文档,打开如 ...

  8. Android开发PDA模板例子,Honeywell PDA Android SDK以及开发方法和样例工程

    [实例简介] 1.在工程中导入SDK文件DataCollection.jar. 2.在AndroidManifest.xml中加入下面的代码来获取扫描权限. 3.在Activity类(如MainAct ...

  9. 深入理解模板模式及实际应用

    2019独角兽企业重金招聘Python工程师标准>>> 原来写了一个博客,记一次Spring环境使用模板模式.用了之后美滋滋.但是通过这几天的压力测试.发现,都怪自己太年少,太懵懂, ...

最新文章

  1. 如何循序渐进有效学习 JavaScript?
  2. linux redis最大连接数,并发编程-并发下redis连接数监测-Go语言中文社区
  3. 零基础大数据学习框架
  4. 第四次博客:循环单链表解决约瑟夫环问题
  5. python 计算相关系数和决定系数
  6. MATLAB--二分法
  7. excel数据库_从案例说excel如何实现数据库管理
  8. 中国草鱼养殖产业发展现状分析,生态养殖是未来发展趋势「图」
  9. 信息学奥赛一本通(C++)版在线评测系统网址
  10. 计算机控制系统——数字控制器设计之模拟控制器的离散化(Chapter 5)
  11. 学生用台灯什么光对眼睛好?开学季精选真正适合孩子的护眼台灯
  12. win8计算机管理员权限删除文件,如何解决 win8系统管理员权限删除文件夹访问被拒绝(3页)-原创力文档...
  13. 数据挖掘人工神经网络,神经网络的数据处理
  14. 数据类型之列表与元组
  15. hubot+slack(slack部分)
  16. 关于时域、频域和波数域的一些概念
  17. tomcat增加内存
  18. 【算法总结】根号算法相关
  19. LSM树的基本原理-学习笔记
  20. jQuery+Ajax实现表格数据不同列标题排序

热门文章

  1. MySQL索引效率对比_mysql下普通索引和唯一索引的效率对比
  2. pycharm安装numpy
  3. 做个爱学习的孩子!收藏2019知名机器学习暑期学校大列表
  4. BigDecimal 使用详解
  5. .net core 微服务通讯组件Orleans的使用与配置
  6. 老旧的金融机构,是时候赶赶云计算的时髦了
  7. fatal error LNK1112: module machine type 'x64' conflicts with target machine type 'X86'
  8. Android 框架炼成 教你怎样写组件间通信框架EventBus
  9. NSOperation下载网络图片(四)
  10. no match for call to ‘(std::__cxx11::string {aka std::__cxx11::basic_string