Android开发之模板模式初探

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/118090.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 项目启动,无法加载Spring xsd文件

    项目启动,无法加载Spring xsd文件问题的产生:有个Java项目(Jar文件),每半小时重启一次,对外提供服务。突然收到报警,早上5点半重启服务时出错,服务无法正常启动。查看启动日志,错误是xml解析失败,无法找到xml元素的声明。具体报错日志如下:INFO:LoadingXMLbeandefinitionsfromclasspathresource[applicationContext-task

    2022年10月24日
  • 你要偷偷学python(所有人都能学的数据分析课)

    标题无意冒犯,就是觉得这个广告挺好玩的上面这张思维导图喜欢就拿走,反正我也学不了这么多文章目录前言欢迎来到我们的圈子并发与串行前言前期回顾:我要偷偷学Python(第十二天)第十二篇的项目还在持续更新中,哎,日理万机虽然谈不上,但是也是手忙脚乱。这不,自动表单生成是写完了,但是学校网络实在是受不了啊,2G,测试不了,就只能一直搁置在那边了。明天就可以去测试了,明天出学校去逛逛。今天的内容,可能很多小伙伴会没有听过,今天要讲多线程的概念,以及协程的使用。后面看看能不能讲一下scrapy框架..

  • PNP和NPN的区别_pnp和npn的二极管图

    PNP和NPN的区别_pnp和npn的二极管图为什么PNP三极管集电极(C)和发射极(E)反着接,却可以当开关使用?理解NPN和PNP两种类型的三极管原理及电流方向就会明白为什么PNP三极管的集电极和发射极反着接当开关使用。NPN和PNP三极

  • kafka官方文档_kafka groupid

    kafka官方文档_kafka groupid介绍Kafka是一个分布式的、分区的、冗余的日志提交服务。它使用了独特的设计,提供了所有消息传递系统所具有的功能。我们先来看下几个消息传递系统的术语:Kafka维护消息类别的东西是主题(topic).

  • 如何查看计算机中的端口占用情况,电脑如何查看端口是否被占用?CMD查看端口占用开放情况…「建议收藏」

    如何查看计算机中的端口占用情况,电脑如何查看端口是否被占用?CMD查看端口占用开放情况…「建议收藏」端口是很多软件和服务用于通讯的,但是实际上会有很多软件或服务端口使用同一个端口,这就导致一个端口被占用后,另一个也需要该端口的应用无法正常工作,那么如何查看端口被占用呢?这里我们可以使用CMD命令来查看。查看端口是否被占用方法:一、打开CMD命令提示符,然后使用“netstat–an|findstr21”确认端口被占用(上面的21可以改成你要查看的端口);listening”“closing”…

  • Apache和Nginx有什么区别

    Apache和Nginx有什么区别Apache和Nginx最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;而nginx是异步的,多个连接(万级别)可以对应一个进程。区别:Apacheapache的rewrite比nginx强大,在rewrite频繁的情况下,用apacheapache模块多apache更为成熟,少bugapache超稳定apache对PHP支持比较交单,nginx需要配合其他后端用apche在处理动态请求有优势,nginx在这方面是鸡肋,一般动态请求用apache去做,nginx适合静态

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号