zoukankan      html  css  js  c++  java
  • 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)重要复杂的算法,核心算法设计为模板算法

  • 相关阅读:
    python每日活力练习Day29
    python活力练习Day28
    python活力练习Day27
    pyhton 活力练习Day26
    排序算法之归并排序
    排序算法之快速排序
    Python 多线程
    排序算法之希尔排序
    排序算法之插入排序
    ELK(elasticsearch+kibana+logstash)搜索引擎(一): 环境搭建
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4076243.html
Copyright © 2011-2022 走看看