场景类:
public class Client {
public static void main(String[] args) {
AbstractClass class1 = new ConcreteClass1();
AbstractClass class2 = new ConcreteClass2();
//调用模板方法
class1.templateMethod();
class2.templateMethod();
}
4.案例讲解
需求
-
有多个类,完成不同的job
-
要求能够得到各自的完成时间
1.)传统方式实现
代码
package Abstract;
public class AbstractExercise {
public static void main(String[] args) {
AA aa = new AA();
aa.calcTime();
BB bb = new BB();
bb.calcTime();
}
}
class AA {
// 计算任务1
// 1 + 2 + …+ 1
必看视频!获取2024年最新Java开发全套学习资料 备注Java
00000
public void calcTime() {
//得到开始时间
long start = System.currentTimeMillis();
job(); // 计算执行任务的时间
// 得到结束时间
long end = System.currentTimeMillis();
System.out.println("AA 执行的时间 " + (end - start) + “毫秒”);
}
long sum = 0;
public void job(){
for (int i = 1; i <= 100000; i++) {
sum += i;
}
}
}
class BB {
// 计算任务2
// 1*1 + 2*2 +… 10000*10000
public void calcTime() {
//得到开始时间
long start = System.currentTimeMillis();
job(); // 计算执行任务的时间
// 得到结束时间
long end = System.currentTimeMillis();
System.out.println("BB 执行的时间 " + (end - start) + “毫秒”);
}
long sum = 0;
public void job(){
for (int i = 1; i <= 10000; i++) {
sum += i * i;
}
}
}
// CC类 DD类…
对于不同的任务它们有自己各自的执行方式,我们需要做的是统计它们各自执行完任务所花费的时间。我们通过观察发现计算时间的方法被重复的使用,方法是一样的方法只是各个任务执行的细节不同罢了,如果有CC类 、DD类…的不同任务job()——因此我们可以将其设置为抽象方法!,那么计算时间的方法calcTime()要在每一个类中使用!这样代码就大量的重复了,不利于修改与维护!——因此我们可以将其设置为模板方法!
2.)模板设计模式实现
抽象模板类(AbstractClass)
package Abstract;
public abstract class Tempalte { //父类——模板类
public abstract void job();// 抽象方法
// 模板方法
public void calcTime() { // 实现方法,调用job()方法
//得到开始时间
long start = System.currentTimeMillis();
job(); // 计算执行任务的时间————动态绑定机制
// 得到结束时间
long end = System.currentTimeMillis();
System.out.println("任务执行的时间 " + (end - start) + “毫秒”);
}
}
具体模板类(ConcreteClass)
package Abstract;
public class AA extends Tempalte{
// 计算任务1
// 1 + 2 + …+ 100000
long sum = 0;
@Override
public void job(){
for (int i = 1; i <= 100000; i++) {
sum += i;
}
}
}
package Abstract;
public class BB extends Tempalte{
// 计算任务2
// 1*1 + 2*2 +… 10000*10000
long sum = 0;
@Override
public void job(){
for (int i = 1; i <= 10000; i++) {
sum += i * i;
}
}
}
测试类(ConcreteClass)
package Abstract;
public class Application {
public static void main(String[] args) {
Tempalte aa = new AA();
aa.calcTime(); // 动态绑定机制,对多态的理解
Tempalte bb = new BB();
bb.calcTime();
}
}
5.模式模式优缺点:
1.)优点
模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。子类实现算法的某些细节,有助于算法的扩展。通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
复习的面试资料
这些面试全部出自大厂面试真题和面试合集当中,小编已经为大家整理完毕(PDF版)
- 第一部分:Java基础-中级-高级
- 第二部分:开源框架(SSM:Spring+SpringMVC+MyBatis)
- 第三部分:性能调优(JVM+MySQL+Tomcat)
- 第四部分:分布式(限流:ZK+Nginx;缓存:Redis+MongoDB+Memcached;通讯:MQ+kafka)
- 第五部分:微服务(SpringBoot+SpringCloud+Dubbo)
- 第六部分:其他:并发编程+设计模式+数据结构与算法+网络
进阶学习笔记pdf
- Java架构进阶之架构筑基篇(Java基础+并发编程+JVM+MySQL+Tomcat+网络+数据结构与算法)
- Java架构进阶之开源框架篇(设计模式+Spring+SpringMVC+MyBatis)
- Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka))
- Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)
- Java架构进阶之分布式架构篇 (限流(ZK/Nginx)+缓存(Redis/MongoDB/Memcached)+通讯(MQ/kafka))
[外链图片转存中…(img-fx85R8VJ-1716462173069)]
[外链图片转存中…(img-ecs9e5kv-1716462173069)]
[外链图片转存中…(img-k82loito-1716462173070)]
- Java架构进阶之微服务架构篇(RPC+SpringBoot+SpringCloud+Dubbo+K8s)
[外链图片转存中…(img-T7i3QZ5m-1716462173071)]
[外链图片转存中…(img-iVFwWoMt-1716462173071)]