00012.02设计模式(模板设计模式的了解)
原创
©著作权归作者所有:来自51CTO博客作者wx632a61a65e0a1的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、入门:什么叫设计模式
1、什么叫设计模式?
前辈们在写了很多代码以后得出来的一种代码的结构,总结出了一些模式,而且确保这样的写法比另外一种写法更优
简单来说就是:解决问题的套路、代码结构
在Java中,常用的设计模式有23种
javaSE阶段只学习
(1)模板设计模式
(2)单例设计模式(☆☆☆☆☆一定要会徒手写出来,理由:代码非常简单,但是又是每个公司的必考题)
(3)工厂设计模式(☆☆一定要会用工厂类的方法)
(4)代理设计模式(☆☆☆要求一定会模仿写出来)
(5)迭代器设计模式
(6)装饰者设计模式
能看懂
(1)模板设计模式
比如我们经常用的PPT模板、论文模板、简历模板、请假条模板
他们有什么特点呢?
特点就是架子都给你搭好了,你去改一下里面的内容就行了
裆部解决问题的时候,总体的算法的结构/步骤是确定的,但是其中的一步或者几步是不确定的,得使用者自己来确定
举例:
例如我们编写一个类,这个类里面包含一个方法,要求可以统计你执行任何一段代码的运行时间
思路:我们想不考虑代码怎么实现,但是经过分析我们可以知道步骤肯定是有这么几个
(1)获取开始的系统时间
(2)执行XXX(要执行的代码)
(3)获取结束时的系统时间
(4)计算时间差
从中我们可以得出,实际上我们并不知道具体执行的是什么代码,但是这个模板是没有错的,具体执行什么代码往里面填就好了
代码实现:
不会的要习惯性的去查API
比如获取开始时间
解决办法:刚刚讲过的abstract,使用抽象方法抽象类,要求使用者继承后必须重写
然后·再去main方法里面去调用子类的方法即可
(2)优化
比如有个需求,需求(1)父类里面的代码不允许被子类修改
解决办法:加上final
需求(2)父类里面的执行部分 doWork()不能被父类单独调用,只能由子类重写,调用子类的doWork()
解决办法:改修饰符为protected
(3)总结
至此整套流程完成。
还是那句话,学习编程就像学习游泳学习开车,想想你考驾照的时候是怎么考到的,车是怎么学会的,光靠理论是远远不够的,还是多练习,多写,多做,多练
完整代码:
package com.atguigu.test02.abstract_;
public class TestTemplate {
public static void main(String[] args) {
CalTime calTime=new MyCalTime();//多态引用
//calTime.getTime();
long time0= calTime.getTime();
System.out.println("耗时:"+time0+"毫秒");
System.out.println("-------------");
MyCalTime myCalTime=new MyCalTime();//正常使用
long time=myCalTime.getTime();
System.out.println("耗时:"+time+"毫秒");
}
}
//模板类
abstract class CalTime{
//可以计算任意一段代码的运行时间
//这里加fina的目的是不希望子类被重写,不希望别人改写我的算法结构
public final long getTime(){
//(1)、获取开始时的系统时间
long start=System.currentTimeMillis();
//(2)执行xxx
doWork();
//(3)获取结束时系统时间
long end = System.currentTimeMillis();
//(4)计算时间差
return end-start;
}
protected abstract void doWork();
}
class MyCalTime extends CalTime{
@Override
protected void doWork() {
// TODO Auto-generated method stub
long sum =0;
for(int i=1;i<=300000;i++){
sum+=1;
}
System.out.println("sum="+sum);
}
}