⭐简单说两句⭐
作者:后端小知识
CSDN个人主页:后端小知识
🔎GZH:
后端小知识🎉欢迎关注🔎点赞👍收藏⭐️留言📝
😎模板方法模式
大家好吖,这个五一大家有没有出去玩吖,如果没有出去玩的话,那么就跟着我来学习模板方法设计模式吧😎
定义
定义了一个 算法的骨架 , 并允许 子类 为 一个或多个 步骤 提供实现;模板方法模式可以使子类在不改变 算法结构 的前提下 , 重新定义算法的某些步骤 ;
举个荔枝
🎨简单举个荔枝
五一了,懒羊羊还在睡懒觉,这时喜羊羊过来叫醒了他
喜羊羊:懒羊羊,快醒醒,起床啦,太阳都晒pp了
懒羊羊:醒了,是吃饭了吗
喜羊羊:你一天天就知道吃🙄 ,不过也不是不可以,我这有个任务,你来帮我做好了,我请你吃烧烤😎
懒羊羊:哇偶,烧烤,为了吃的我拼了😋,不对,其实我是为了学知识,才不是为了烧烤呢😎
喜羊羊:听你在这gui扯😂
喜羊羊:我现在给你安排任务,你测试下java中,ArrayList和LinkedList的插入效率哪个高一些
懒羊羊:我还以为是什么难题呢,需要我亲子动手,这个so easy啦
【One Hour Later】
懒羊羊:喜羊羊,我写好了,你看,这是代码
Client
public class Client {
public static void main(String[] args) {
System.out.println("测试开始");
long start = System.currentTimeMillis();
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < 10000010; i++) {
arrayList.add(i);
}
long end = System.currentTimeMillis();
System.out.println("测试结束");
System.out.println(end-start);
System.out.println("测试开始");
start = System.currentTimeMillis();
LinkedList<Integer> linkedList = new LinkedList<>();
for (int i = 0; i < 10000010; i++) {
linkedList.add(i);
}
end = System.currentTimeMillis();
System.out.println("测试结束");
System.out.println(end-start);
}
}
这是测试结果
懒羊羊:任务完成啦,我要吃烧烤😎
喜羊羊:你这写的啥代码啊,怎么还有重复的模块呢,你看看:
喜羊羊:快改,不然你的烧烤就飞了
懒羊羊:不要不要,我马上改
【懒羊羊去查询了下资料,发现这个可以用模板方法模式优化】
懒羊羊:学到了,我用模板方法优化下,我把重复的部分定义成一个模板不就好了,真聪明😎
懒羊羊:我先定义一个模板抽象类,里面定义一个模板方法,将公用的放到模板方法里面去,具体需要测试的代码放到testCode方法里面去
【Tips】:定义了一个 算法的骨架
Template
public abstract class Template {
/**
* 模板方法
*/
public void template(){
System.out.println("测试开始");
long start = System.currentTimeMillis();
testCode();
long end = System.currentTimeMillis();
System.out.println("测试结束");
System.out.println(end-start);
}
/**
* 需要测试的代码
*/
protected abstract void testCode();
}
懒羊羊:然后我们定义一个ArrayTest类和ListTest继承Template类
ArrayTest
public class ArrayTest extends Template{
/**
* 需要测试的代码
*/
@Override
protected void testCode() {
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < 10000010; i++) {
arrayList.add(i);
}
}
}
ListTest
public class ListTest extends Template{
/**
* 需要测试的代码
*/
@Override
protected void testCode() {
LinkedList<Integer> linkedList = new LinkedList<>();
for (int i = 0; i < 10000010; i++) {
linkedList.add(i);
}
}
}
懒羊羊:最后我们在client中简单写一下即可😊
Client
public class Client {
public static void main(String[] args) {
ArrayTest arrayTest = new ArrayTest();
arrayTest.template();
System.out.println("=================");
ListTest listTest = new ListTest();
listTest.template();
}
}
懒羊羊:收工,运行看结果
喜羊羊:嗯,还是阔以嘛,我看下,基本合格吧,阔以去吃烧烤
🍔模式类图
懒羊羊:这个类图就很简单啦
🧂优缺点
优点:
- 模板方法模式将不变的行为抽提到了父类中,去除了重复代码
- 子类可以自由实现抽象算法中的具体细节,阔以扩展
缺点:
- 我们发现啊,每个不同的实现都需要定义一个子类,后期可能会导致超级多的类,维护变得复杂
🍗适用环境
-
当有一组类似的问题需要解决时,可以使用模板设计模式来避免重复编写代码;
-
当需要通过固定的步骤来完成一项任务时,可以使用模板设计模式来建立一个过程框架,其中每个步骤都可以由子类实现;
-
当需要定义一组操作的执行顺序时,可以使用模板设计模式来定义算法骨架,并允许子类实现特定的步骤;
-
当需要控制某个算法的流程时,可以使用模板设计模式来使用固定的流程模板,并通过子类来提供不同的实现。
【都看到这了,点点赞点点关注呗,爱你们】😚😚
结语
谢谢你的阅读,由于作者水平有限,难免有不足之处,若读者发现问题,还请批评,在留言区留言或者私信告知,我一定会尽快修改的。若各位大佬有什么好的解法,或者有意义的解法都可以在评论区展示额,万分谢谢。
写作不易,望各位老板点点赞,加个关注!😘😘😘
💬
作者:后端小知识
CSDN个人主页:后端小知识
🔎GZH:后端小知识
🎉欢迎关注🔎点赞👍收藏⭐️留言📝