Android开发之模板模式初探
模板模式我认为在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()方法的keyword一定为final,保证子类仅仅能改动可见的方法,保证模板框架的稳定,须要子类实现的方法定义为Protected属性而且为一个抽象类,由子类来对其自由发挥,就像我们Android每个类一般都会继承Activity类,复写当中的oncreate()方法一样,其属性也为protected.不想在子类可见的方法,我们需将其定位为private属性而且写好方法体。
我们还能够发现我们在当中定义了一个isCustomerWantsCondiments()方法,这种方法就是hook钩子,增加模板框架的灵活性,该方法能够在子类中重写,以此来推断是否须要运行某个方法。
public class Tea extends RefreshBeverage { @Override
protected void brew() {
System.out.println("用80度的热水浸泡茶叶5分钟");
} @Override
protected void addCondiments() {
System.out.println("增加柠檬");
} @Override
/*
* 子类通过覆盖的形式选择挂载钩子函数
* @see com.imooc.pattern.template.RefreshBeverage#isCustomerWantsCondiments()
*/
protected boolean isCustomerWantsCondiments(){
return false;
} }
我们写了一个泡茶的类,并将hook方法复写返回false, 取消了制备饮料的第四步。
那么我们什么时候须要使用模板类呢?
(1)算法或操作遵循类似的逻辑时
(2)重构时(把同样的代码抽入到父类中),提高程序的复用性
(3)重要复杂的算法,核心算法设计为模板算法
Android开发之模板模式初探的更多相关文章
- Android开发之策略模式初探
策略模式主要定义一系列的算法,学过数据结构的朋友肯定知道,对于数组从大到小进行排序有着非常多的算法.比方冒泡.交换.高速插入等等,策略模式就是把这些算法封装成一个个独立的类.方便使用时 ...
- android 开发设计模式---Builder模式
我们通过一个例子来引出Builder模式.假设有一个Person类,我们通过该Person类来构建一大批人,这个Person类里有很多属性,最常见的比如name,age,weight,height等等 ...
- Android开发之Buidler模式初探结合AlertDialog.Builder解说
什么是Buidler模式呢?就是将一个复杂对象的构建与它的表示分离,使得相同的构建过程能够创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它同意用户能够仅仅通过指定复杂对象 ...
- Android开发——Activity启动模式详解
1. Activity的启动模式 本文原创,转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52054893 1.1 Standard标 ...
- Android开发之启动模式的深入理解
standard(标准模式): 当用ApplicationContext去启动standard模式时会报错,是因为非Activity类型的Context没有所谓的任务栈, 所以需要为待启动的Activ ...
- android 开发设计模式---Strategy模式
假设我们要出去旅游,而去旅游出行的方式有很多,有步行,有坐火车,有坐飞机等等.而如果不使用任何模式,我们的代码可能就是这样子的. 12345678910111213141516171819202122 ...
- android 开发 singleTask启动模式下传值的坑
日常填坑. 做了什么操作引起的?如下: 在活动A 启动模式设置为singleTask ,然后再用活动A启动活动B,活动B启动活动C. 现在我的活动C要使用intent携带值去启动活动A.在活动A中正常 ...
- Android开发 互相调用模式之导出Jar包、扩展MainActivity、Java主导
首先讲导出Jar包,在以前都是用这种方法,但是现在官方不推荐使用此方法,官方推荐导出Aar包 (1)首先创建一个Android空工程 注意:这里选择API 16,因为Unity支持的最低是API 16 ...
- Android开发 互相调用模式之导出Aar包、扩展MainActivity、Java主导
现在官方推荐使用这种方式 在讲导出Aar之前,先讲一下怎么设置图标,先把原xml中图标设置这句话复制过来 刚刚复制过来的时候这句话是红色报错的,这个时候我们把原res下的mipmap复制过来,也可以自 ...
随机推荐
- 抽象类(abstract class)和 接口(interface)
PHP中的 抽象类(abstract class)和 接口(interface) 一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方 ...
- Javascript 调试利器 Firebug使用详解
Javascript 调试利器 Firebug使用详解 有时候,为了更清楚方便的查看输出信息,我们可能需要将一些调试信息进行分组输出,那么可以使用console.group来对信息进行分组,在组信息输 ...
- Ubuntu下使用sshfs挂载远程目录到本地(和Windows挂载盘一样)
访问局域网中其他Ubuntu机器,在不同机器间跳来跳去,很是麻烦,如果能够把远程目录映射到本地无疑会大大方面使用,就像Windows下的网络映射盘一样.在Linux的世界无疑也会有这种机制和方式,最近 ...
- Coreseek:第二步建索引及測试
1,建索引非常easy.一行代码 g:/service/coreseek/bin/indexer -c g:/service/coreseek/etc/csft_mysql.conf person ...
- gbs remotebuild使用说明
本文件从:https://source.tizen.org/documentation/articles/gbs-remotebuild翻译而来. 1 远程构建 使用remotebuild子指令将本地 ...
- 微软HR泄露的asp.net面试题
1.面向对象的思想主要包括什么? 2.什么是ASP.net中的用户控件? 3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载? 4.列举一下你所了解的XML技术及 ...
- the least common multiplier
Description There are many unsolvable problem in the world.It could be about one or about zero.But t ...
- Vmdk文件如何使用,vmdk导入虚拟机VMware8.0教程
一.打开虚拟机VMware Workstation8.0,点击新建虚拟机. 二.进入虚拟机向导,选择自定义. 三.这里保持默认即可. 四.这里选择“我以后安装操作系统”. 五.这里选择Windows ...
- Java-对象多态性
class A { public void fun1() { System.out.println("<----A------>"); } public v ...
- MySQL内存表(MEMORY)说明 | 一个PHP程序员的备忘录
MySQL内存表(MEMORY)说明 | 一个PHP程序员的备忘录 MySQL内存表(MEMORY)说明