文档章节

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

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方法 

 

© 著作权归作者所有

共有 人打赏支持
上一篇: Linux 文件属性
下一篇: nginx 操作
Jake_xun
粉丝 4
博文 55
码字总数 24233
作品 0
私信 提问
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
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
设计模式知识汇总(附github分享)

写在前面 主要内容 为了更系统的学习设计模式,特地开了这样一个基于Java的设计模式【集中营】,都是笔者在实际工作中用到过或者学习过的一些设计模式的一些提炼或者总检。慢慢地初见规模,也...

landy8530
10/10
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
228
2
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

SpringBoot与pageHelper版本问题

<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version></parent> <dependency>......

WALK_MAN
11分钟前
1
0
PHP开发支付宝微信个人免签支付接口实例

这是一个PHP开发支付宝微信个人免签支付接口实例,支付宝微信即时到帐接口,使用原生支付宝即时到帐接口修改而来,即可实现多接口收款功能,开发只需要按照支付宝即时到帐接口开发即可,减少...

sucaihuo
16分钟前
2
0
《孩子,你慢慢来》的读书笔记与读后感2600字

《孩子,你慢慢来》的读书笔记与读后感2600字: 龙——保护儿童的思维: 今天读《孩子,你慢慢来》龙这一节,安安的妈妈是中国人,她在安安两岁的时候就认识到安安有着固执的个性。安安正是处...

原创小博客
28分钟前
2
0
kubernetes每个节点创建一个服务的Pod

1. 问题场景 希望一个worker节点上仅部署同样的服务一个. 比如: kubernets有三个worker节点,三个节点部署N个副本的api服务, 为了提高服务效率希望加入缓存,需要为三个节点个部署一个redis服务...

jimmywa
31分钟前
5
0
搭建Git服务器

Git本身是没有服务器和客户端的区别,但是如果我们要共享git仓库时,就需要ssh、http,它们就有服务器和客户端的区别。 Windows平台下搭建Git服务器 1、在自己电脑搭建Git服务器,且只有自己...

国仔饼
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部