文档章节

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

Jake_xun
 Jake_xun
发布于 2017/07/21 17:25
字数 738
阅读 4
收藏 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
博文 55
码字总数 24233
作品 0
JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模式、工厂方法模式、单例设计模式之饿汉式和懒汉式、Runtime类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52717096 JAVA基础再回首(二十六)——面向对象思想设计原则、设计模式、简单工厂模...

Aduroidpc
2016/10/01
0
0
JavaScript 中常见设计模式整理

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

牧云云
05/18
0
0
23种设计模式(12):策略模式

定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换。 类型:行为类模式 类图: 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,...

LCZ777
2014/07/09
0
0
php各种设计模式简单实践思考

前言 我一直觉得什么框架,版本,甚至语言对于一个coder来说真的不算什么,掌握一个特别高大上的一个框架或者是一个新的,少众的语言真的不算什么,因为你可以,我要花时间也可以,大家都是这...

michaelgbw
2016/06/13
0
0
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180925 df与du命令、fdisk磁盘分区

df 命令 disk filesystem的缩写,查看已挂载磁盘的总容量、使用容量、剩余容量信息。 [root@centos01 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/sda3 27...

野雪球
32分钟前
1
0
Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
58分钟前
2
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
59分钟前
1
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
今天
2
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部