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)重要复杂的算法,核心算法设计为模板算法

时间: 2024-08-24 17:21:21

Android开发之模板模式初探的相关文章

Android开发之策略模式初探

策略模式主要定义一系列的算法,学过数据结构的朋友肯定知道,对于数组从大到小进行排序有着很多的算法,比如冒泡.交换.快速插入等等,策略模式就是把这些算法封装成一个个独立的类,方便使用时候进行任意的调用.这里以字符串替代为例, 有一个文件,我们需要读取后,希望替代其中相应的变量,然后输出.关于替代其中变量的方法可能有多种方法,这取决于用户的要求,所以我们要准备几套变量字符替代方案. 首先,我们建立一个抽象类RepTempRule 定义一些公用变量和方法: public abstract class

Android开发之工厂模式初探

工厂模式(Factory)是比较常见的一种模式我觉得也是一种非常容易理解的一种模式,举个简单的例子吧,我们小时候经常考试,每次最害怕的就是爸妈问考试试卷的分数,不同的分数我们的心情也是不一样的.那么我们就根据这个情况以工厂模式写一个Java程序. public class Factory { public static Student_test creator(String rank){ if(rank.equals("优秀")){ return new Student_Laugh()

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

什么是Buidler模式呢?就是将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象的类型和内容就可以构建它们. 那么要为何使用Buidler呢? 是为了将构建复杂对象的过程和它的部件分开因为一个复杂的对象,不但有很多大量组成部分,如AlertDialog对话框,有很多组成部件,比如Tittle,Message,icon,PositiveButton等等,但远不止这些,如何将这些部件装配成一个A

Android开发中MVP模式浅析

目前为止,MVP的使用还没有一个标准,在此先记录一下目前学习到的一些Android中使用MVP的知识. 按传统的方式开发,经常会使Activity中混杂着UI交互,业务逻辑等流程.而MVP模式能巧妙的解决这个问题.先直接上一个小例子吧. /** * 定义一个对UI组件进行操作的接口,让Activity实现这个接口 * @author Quinn * @date 2015-5-9 */ public interface LoginView { public void showProgress();

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

什么是Buidler模式呢?就是将一个复杂对象的构建与它的表示分离,使得相同的构建过程能够创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它同意用户能够仅仅通过指定复杂对象的类型和内容就能够构建它们. 那么要为何使用Buidler呢? 是为了将构建复杂对象的过程和它的部件分开由于一个复杂的对象,不但有非常多大量组成部分,如AlertDialog对话框,有非常多组成部件,比方Tittle,Message,icon,PositiveButton等等,但远不止这些,怎样将这些部件装配成

Android开发 - ActivityLifecycleCallbacks使用方法初探

ActivityLifecycleCallbacks是什么? Application通过此接口提供了一套回调方法,用于让开发者对Activity的生命周期事件进行集中处理. 为什么用ActivityLifecycleCallbacks? 以往若需监测Activity的生命周期事件代码,你可能是这样做的,重写每一个Acivity的onResume(),然后作统计和处理: @Override protected void onResume() { super.onResume(); //TODO 处

android开发装饰者模式

1. package test; interface Dongwu {    void eat();} 2. package test; public class Gou implements Dongwu{    public void eat() {        // TODO Auto-generated method stub        System.out.println("我是小狗");    } } 3. package test; public class Mao

Android开发学习--MVP模式入门

1.模型与视图完全分离,我们可以修改视图而不影响模型2.可以更高效地使用模型,因为所有的交互都发生在一个地方--Presenter内部3.我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑.这个特性非常的有用,因为视图的变化总是比模型的变化频繁.4.如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试) 下面示例一个小案例: 项目架构: 首先bean层: User.java public class User { privat

.NET开发设计模式-模板模式

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Pay { /// <summary> /// 付款成功回调 /// </summary> public class PayNotify { /// <summary> /// 执行付款操作 /// 对外只提供该接口 //