一、入门:什么叫设计模式

1、什么叫设计模式?
前辈们在写了很多代码以后得出来的一种代码的结构,总结出了一些模式,而且确保这样的写法比另外一种写法更优
简单来说就是:解决问题的套路、代码结构
在Java中,常用的设计模式有23种
javaSE阶段只学习
(1)模板设计模式
(2)单例设计模式(☆☆☆☆☆一定要会徒手写出来,理由:代码非常简单,但是又是每个公司的必考题)
(3)工厂设计模式(☆☆一定要会用工厂类的方法)
(4)代理设计模式(☆☆☆要求一定会模仿写出来)
(5)迭代器设计模式
(6)装饰者设计模式
能看懂

(1)模板设计模式

比如我们经常用的PPT模板、论文模板、简历模板、请假条模板
他们有什么特点呢?
特点就是架子都给你搭好了,你去改一下里面的内容就行了
裆部解决问题的时候,总体的算法的结构/步骤是确定的,但是其中的一步或者几步是不确定的,得使用者自己来确定

00012.02设计模式(模板设计模式的了解)_设计模式

举例:

例如我们编写一个类,这个类里面包含一个方法,要求可以统计你执行任何一段代码的运行时间

思路:我们想不考虑代码怎么实现,但是经过分析我们可以知道步骤肯定是有这么几个

(1)获取开始的系统时间

(2)执行XXX(要执行的代码)

(3)获取结束时的系统时间

(4)计算时间差

从中我们可以得出,实际上我们并不知道具体执行的是什么代码,但是这个模板是没有错的,具体执行什么代码往里面填就好了

代码实现:

不会的要习惯性的去查API

比如获取开始时间

00012.02设计模式(模板设计模式的了解)_设计模式_02


00012.02设计模式(模板设计模式的了解)_System_03

00012.02设计模式(模板设计模式的了解)_设计模式_04


解决办法:刚刚讲过的abstract,使用抽象方法抽象类,要求使用者继承后必须重写

00012.02设计模式(模板设计模式的了解)_设计模式_05


00012.02设计模式(模板设计模式的了解)_设计模式_06


然后·再去main方法里面去调用子类的方法即可

00012.02设计模式(模板设计模式的了解)_设计模式_07

(2)优化

比如有个需求,需求(1)父类里面的代码不允许被子类修改

解决办法:加上final

00012.02设计模式(模板设计模式的了解)_System_08


需求(2)父类里面的执行部分 doWork()不能被父类单独调用,只能由子类重写,调用子类的doWork()

解决办法:改修饰符为protected

00012.02设计模式(模板设计模式的了解)_System_09

(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);
}
}