文档章节

常见设计模式---模版设计模式

Jake_xun
 Jake_xun
发布于 2017/07/21 17:25
字数 738
阅读 4
收藏 0
点赞 0
评论 0

1 , 模版设计模式概述

模版方法模式就是定义一个算法的骨架,而将具体的算法延迟到子类中来实现

优点

使用模版方法模式,在定义算法骨架的同时,可以很灵活的实现具体的算法,满足用户灵活多变的需求

缺点

如果算法骨架有修改的话,则需要修改抽象类

2, 举例

原始需求

 计算复制一段视频所用到的时间, 那么可以这么写

定义一个类, 提供一个获取时间的方法, 该方法中写 复制视频的功能


public class GetTime {
	
	public long getTime() {
		
		long start = System.currentTimeMillis();
		
		BufferedInputStream bufferedInputStream = null;
		BufferedOutputStream bufferedOutputStream = null;
		
		//封装数据源
		try {
			bufferedInputStream = new BufferedInputStream(new FileInputStream("001.avi"));
			//封装目的地
			bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("003.avi"));
			
			//定义一个用于存储读取到的字节 的数组
			byte[] bys = new byte[1024];
			int len = 0;
			
			while( (len = bufferedInputStream.read(bys)) != -1 ) {
				
				bufferedOutputStream.write(bys);
				
			}
		}catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bufferedInputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				bufferedOutputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
		
		long end = System.currentTimeMillis();
		
		return end - start;
	}

测试类中, 创建该类对象, 调用获取时间的方法

public class GetTimeDemo {
	
	public static void main(String[] args) {
		
		GetTime GetTime = new GetTime();
		
		System.out.println(GetTime.getTime()+"毫秒");
		
	}

这样是可以实现 , 但是,如果需求发生变化 , 由原来统计复制视频所需要的时间变为 执行一段 for循环所需要的时间呢 ?

是不是要去修改原来的  GetTime 类中 getTime() 方法呢 ?

这样是可以实现, 但是代码改动太大, 说明原来的代码扩展性不好

改进一 :

在 GetTime类中, 不写具体的实现方法, 而是定义抽象模版方法 , GetTime类改为抽象类 , 通过一个子类实现GetTime抽象类, 复写抽象模版方法 

public abstract class GetTime {
	
	public long getTime() {
		
		long start = System.currentTimeMillis();
		
		// 定义一个模版方法
		template();
		
		long end = System.currentTimeMillis();
		
		return end - start;
	public abstract void template();

由实现类 实现具体的 要记录时间的方法


public class CopeDemo extends GetTime{

	public void template() {
		
		BufferedInputStream bufferedInputStream = null;
		BufferedOutputStream bufferedOutputStream = null;
		
		//封装数据源
		try {
			bufferedInputStream = new BufferedInputStream(new FileInputStream("001.avi"));
			//封装目的地
			bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("003.avi"));
			
			//定义一个用于存储读取到的字节 的数组
			byte[] bys = new byte[1024];
			int len = 0;
			
			while( (len = bufferedInputStream.read(bys)) != -1 ) {
				
				bufferedOutputStream.write(bys);
				
			}
		}catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bufferedInputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				bufferedOutputStream.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}
}

测试类中 创建父类引用 , 指向 子类 CopeDemo对象 , 调用getTime方法 , 就是多态的使用

	public static void main(String[] args) {
		
		GetTime GetTime = new CopeDemo();
		
		System.out.println(GetTime.getTime()+"毫秒");
		
	}

需求变更

这个时候需求变化了, 不统计复制视频需要的时间了, 统计其他任务的时间, 例如 执行一段for循环所话费的时间

这个时候, 可以定义 一个子类 继承 含有模版抽象方法的抽象类 GetTime , 复写 getTime方法, 在实现类中定义 for循环 , 在测试类中 使用多态 , 调用子类中的 getTime方法 

 

© 著作权归作者所有

共有 人打赏支持
Jake_xun
粉丝 4
博文 54
码字总数 24233
作品 0
JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云 ⋅ 05/18 ⋅ 0

代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian ⋅ 05/22 ⋅ 0

设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu ⋅ 2017/11/02 ⋅ 0

系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127 ⋅ 2017/11/12 ⋅ 0

Java经典设计模式-结构型模式-适配器模式(Adapter)

适配器模式 适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的...

Idea ⋅ 01/20 ⋅ 0

设计模式.策略模式

策略模式跟抽象工厂非常相似,基本逻辑是根据需要实例化出需要用的类。不同的是策略模式需要调用者非常清晰的知道有哪些策略,各个策略的调用规则,而抽象工厂的话,需要知道有哪些类,找到调...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗 ⋅ 05/08 ⋅ 0

JavaScript 中常见设计模式-代理模式

     代理模式   情景:小明追女生 A   非代理模式:小明 =花=> 女生A   代理模式:小明 =花=> 让女生A的好友B帮忙 =花=> 女生A   代理模式的特点   代理对象和本体对象具有一...

webstack前端栈 ⋅ 06/15 ⋅ 0

C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部