常见设计模式---模版设计模式
博客专区 > Jake_xun 的博客 > 博客详情
常见设计模式---模版设计模式
Jake_xun 发表于6个月前
常见设计模式---模版设计模式
  • 发表于 6个月前
  • 阅读 4
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

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

 

共有 人打赏支持
粉丝 1
博文 37
码字总数 22768
×
Jake_xun
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: