Java大白话介绍~设计模式:模板方法(TemplateMethod)

模板方法设计模式

抽象类体现的就是一种模板模式的设计,抽象类做为多个子类的通用模板,子类在抽象类的基础上进行拓展、改造,但子类整体上会保留抽象类的行为方式。java

模板方法解决的问题

当功能内部一部分实现是肯定的,一部分实现是不肯定的。这时能够把不肯定的部分暴露出去,让子类去实现。
换句话说,在软件开发中实现一个算法时,总体的步骤很固定、通用,这些步骤已经在父类中写好了。可是某些部分不肯定,不肯定的部分能够抽象出来,供不一样子类实现。这就是一种模板模式。web

代码举例

咱们建立一个父类Template,该父类咱们建立一个spendTime的方法,想计算出某一段代码的运行时间。总体的步骤就是:
①获取当前的时间
②代码(就是你想测试运行时间的代码)
③获取当前的时间
④两次获取的时间相减,就得出②号代码运行的时间了
可是!问题在于,②号到底要测试什么代码,有好几种状况,咱们不肯定,但是①②④的步骤咱们是百分之一万肯定的。因此就将②号须要测试的代码,在父类Template中,给封装成一个抽象方法,让子类去重写,再经过多态来调用。算法

public class TemplateTest { 
 
   
	public static void main(String[] args) { 
 
   
		
		//此处为多态
		Template sub = new SubTemplate();
		sub.spendTime();
		
		//分界线
		System.out.println("**************************");

		//此处为多态
		Template sub_1 = new SubTemplate_1();
		sub_1.spendTime();
	}
}

abstract class Template{ 
 
   
	
	//计算某段代码执行所须要花费的时间
	public void spendTime() { 
 
   
		//获取当前时间
		long start = System.currentTimeMillis();
		//被测试代码
		code();
		//获取当前时间
		long end = System.currentTimeMillis();
		//输出代码运行时间
		System.out.println("花费的时间为:" + (end - start));
		
	}
	//因为code内具体是什么代码,不肯定,此处将其设为抽象方法,交给子类去具体实现
	public abstract void code();
}

class SubTemplate extends Template{ 
 
   
	//重写父类code方法,计算一千之内的质数
	public void code() { 
 
   
		for(int i = 2;i < 1000;i++	) { 
 
   
			boolean isFlag = true;
			for(int j = 2;j < Math.sqrt(i);j++) { 
 
   
				if(i % j == 0) { 
 
   
					isFlag = false;
					break;
				}
			}
			if(isFlag) { 
 
   
				System.out.println(i);
			}
		}
	}
}
class SubTemplate_1 extends Template{ 
 
   
	//重写父类code方法,计算五百之内的质数
	public void code() { 
 
   
		for(int i = 2;i < 500;i++	) { 
 
   
			boolean isFlag = true;
			for(int j = 2;j < Math.sqrt(i);j++) { 
 
   
				if(i % j == 0) { 
 
   
					isFlag = false;
					break;
				}
			}
			if(isFlag) { 
 
   
				System.out.println(i);
			}
		}
	}
}

一句话归纳设计模式:模板方法

父类Template就是一个模板,这个模板单独拿出来没有任何意义,只有根据不一样的状况去实例化不一样的子类,子类重写父类的空白的抽象方法,二者结合,才有了意义。设计模式

总结

由上述代码能够总结,咱们不肯定要测试哪段代码的执行时间,咱们就在父类中建立一个抽象方法,而后在子类中去具体实现该方法,而后经过多态来实现访问子类中被重写的方法,就能够实现测试不一样的代码运行的时间。
此处只是举了一个简单的例子,模板方法还有不少用途。svg

读者可能存在的疑惑

①父类中的public abstract void code();为何要声明为抽象的,不声明抽象,我子类也能够重写该方法,实现相同的效果。
答:若是父类该方法不声明为抽象方法,该方法就得写成public void code(){ },而且存在万一子类没有重写code方法,而后你又调用了spendTime()方法,那么这样子作毫无心义。此处将其声明为抽象方法,就会强制要求你子类中必须重写code方法,尽可能的减小了调用了一个空的方法体的可能,若是你子类重写仍是重写空的方法体,那这样子作也没意义呀。测试

②父类Template和子类code都不声明为抽象,也能够实现上述状况代码
答:此处回答同上,若是父类Template和子类code都不是抽象的,那么就能够直接建立一个父类的实例,调用里面的方法,可是code方法又是空的,这样子作毫无心义,声明为抽象就是不但愿大家建立父类的实例,父类仅仅就是做为一个模板而存在。spa

本文分享 CSDN - 弹弹霹雳。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。.net

相关文章
相关标签/搜索