前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >设计模式【13】-- 模板模式怎么弄?

设计模式【13】-- 模板模式怎么弄?

作者头像
秦怀杂货店
发布于 2022-02-15 06:44:28
发布于 2022-02-15 06:44:28
1.3K00
代码可运行
举报
文章被收录于专栏:技术杂货店技术杂货店
运行总次数:0
代码可运行

Part0前言

剑指Offer & LeetCode刷题仓库https://github.com/Damaer/CodeSolution 文档地址https://damaer.github.io/CodeSolution/ 刷题仓库介绍刷题仓库:CodeSolution 编程知识库https://github.com/Damaer/Coding 文档地址https://damaer.github.io/Coding/#/ 剑指OfferV2 系列已经完成,补增 V2 题目以及C++语言解法,发送 剑指Offer 可获取pdf

设计模式

开局还是那种图,各位客官往下看...

张无忌学太极拳,忘记了所有招式,打倒了"玄冥二老",所谓"心中无招"。设计模式可谓招数,如果先学通了各种模式,又忘掉了所有模式而随心所欲,可谓OO之最高境界。

1模板模式是什么?

模板模式,同样是一种行为型模式,也就是关于对象做什么或者怎么做的设计模式。模板模式的本质需要定义操作中的算法的框架,但是有一些步骤,又不需要具体的实现,而是不同的子类各自实现。子类不能修改流程框架,但是部分的步骤可以做定制化的实现。

主要要解决一个问题:一些通用的方法,但是每一个子类却都重新写,冗余。

比如说,做菜的步骤一般是:洗锅 --> 炒菜 --> 洗碗 ,不同的菜,只是炒菜这一个步骤具体细节是不同的,但是其他步骤确实几乎一模一样的,这样其实整体框架,以及重复的步骤,我们可以抽象到模板中,而不同的细节方法可以开放给每一种菜(具体实现)去定制。

又比如造房子的时候,很多地方的建造都是一样的:地基,墙壁,水管等等,但是不同的房子里面的内部的设计又有所不同。

2不使用模板模式

就挑个简单的例子“炒菜”,如果不使用模板模式的话,糖醋鲤鱼:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

public class SweetAndSourCarp {

    public void cookFood(){
        washPan();
        cook();
        eat();
        washDishes();
        System.out.println("");
    }

    private void washPan(){
        System.out.print("洗锅 --> ");
    }

    private void cook(){
        System.out.print("煮糖醋鲤鱼 --> ");
    }

    private void eat(){
        System.out.print("吃饭 --> ");
    }

    private void washDishes(){
        System.out.print("洗碗 --> ");
    }
}

再弄一个农家小炒肉,需要写很多相同的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ShreddedPorkWithVegetables {

    public void cookFood(){
        washPan();
        cook();
        eat();
        washDishes();
        System.out.println("");
    }

    private void washPan(){
        System.out.print("洗锅 --> ");
    }

    private void cook(){
        System.out.print("炒农家小炒肉 --> ");
    }

    private void eat(){
        System.out.print("吃饭 --> ");
    }

    private void washDishes(){
        System.out.print("洗碗 --> ");
    }
}

测试类如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Test {
    public static void main(String[] args) {
        SweetAndSourCarp sweetAndSourCarp = new SweetAndSourCarp();
        sweetAndSourCarp.cookFood();

        ShreddedPorkWithVegetables shreddedPorkWithVegetables = new ShreddedPorkWithVegetables();
        shreddedPorkWithVegetables.cookFood();
    }
}

测试结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
洗锅 --> 煮糖醋鲤鱼 --> 吃饭 --> 洗碗 --> 
洗锅 --> 炒农家小炒肉 --> 吃饭 --> 洗碗 -->

可以看到,整体流程是一样的,有些步骤一样,有些步骤不一样,但是不使用模板模式,需要每个类都重写一遍方法,即使是通用方法,整个流程都需要自己写一遍。

3使用模板模式优化

如果使用模板模式,那么我们会抽象出一个抽象类,定义整体的流程,已经固定的步骤,开放需要定制的方法,让具体的实现类按照自己的需求来定制。

定义的抽象类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class CookFood {
    public final void cookFood() {
        washPan();
        cook();
        eat();
        washDishes();
        System.out.println("");
    }

    private final void washPan() {
        System.out.print("洗锅 --> ");
    }

    public abstract void cook();

    private final void eat() {
        System.out.print("吃饭 --> ");
    }

    private final void washDishes() {
        System.out.print("洗碗 --> ");
    }
}

具体的实现类糖醋鲤鱼:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class SweetAndSourCarp extends CookFood {
    @Override
    public void cook() {
        System.out.print("煮糖醋鲤鱼 --> ");
    }
}

农家小炒肉:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ShreddedPorkWithVegetables extends CookFood {
    @Override
    public void cook() {
        System.out.print("炒农家小炒肉 --> ");
    }
}

测试类与前面的一样,测试结果也一样,这里不再重复。

上面的方法中,其实我们只开放了cook()方法,这就是钩子方法

在模板方法模式的父类中,我们可以定义一个方法,它默认不做任何事,子类可以视情况要不要覆盖它,该方法称为 ”钩子方法”

钩子方法是开放的,可以由子类随意覆盖,但是像上面的其他方法,我们不希望子类重写或者覆盖它,就可以用 final 关键字,防止子类重写模板方法。

4模板模式的应用

其实在 JDKThread 实现中,就是使用了模板模式,我们知道创建线程有两个方式:

  • 创建 Thread
  • 实现 runnable 接口

我们实现的一般是 run() 方法, 但是调用的却是 start() 方法来启动线程,这个原因就是 start() 方法里面帮我们调用了run()方法, run()方法是开发的方法,我们可以覆盖重写它。

Start0()是一个native方法,是由 c 语言去实现的,在调用的时候,真正调用了我们的 run() 方法,如果需要跟踪这个方法需要到 HotSpot底层去。这里介绍的目的是让大家了解,它同样是使用了模板模式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    private native void start0();

了解 native 关键字可以参考:native关键字到底是什么东西?

5模板模式的优缺点

模板模式的优点:

  • 1、封装固定的部分,拓展需要定制修改的部分,符合开闭原则。
  • 2、公共的代码在父类中,容易维护。
  • 3、整个流程由父类把握,调整比较方便。

缺点:

  • 1、子类可能会很多,系统复杂度上升。
  • 2、子类只有一小部分实现,了解全部方法则需要在父类中阅读,影响代码阅读。

总结:代码该隐藏的复杂细节隐藏起来,开放定制化部分,优雅!

设计模式系列

【作者简介】

秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。个人网站:http://aphysia.cn ,关注我,我们一起成长吧~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秦怀杂货店 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式【13】-- 模板模式怎么弄?
模板模式,同样是一种行为型模式,也就是关于对象做什么或者怎么做的设计模式。模板模式的本质需要定义操作中的算法的框架,但是有一些步骤,又不需要具体的实现,而是不同的子类各自实现。子类不能修改流程框架,但是部分的步骤可以做定制化的实现。
秦怀杂货店
2022/02/10
9110
15.模版模式设计思想
模版模式是一种行为设计模式,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。这种方式让子类可以在不改变算法结构的情况下重新定义算法的某些特定步骤。文章详细介绍了模版模式的基础概念、应用场景、实现原理及优缺点,并通过具体案例深入解析了模版模式的使用方法。适合初学者和有一定经验的开发者深入学习。
杨充
2024/11/20
1270
设计模式(二十三) 模板模式
模板模式也是一种行为型模式,而且它非常好理解。当我们解决问题需要固定几个步骤, 这些步骤的顺序不能改变,而步骤的具体实现可以变化的时候,就可以使用模板模式。模板模式的要点就是定义一个具体方法,固定解决
乐百川
2018/01/09
4370
设计模式--模板模式
  定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。
HUC思梦
2020/09/03
3610
设计模式【6.1】-- 初探适配器模式
适配器模式的主要目的就是为了兼容性,把原来不匹配的两个类或者接口可以协同工作,它属于结构型模式,主要分为三种:类适配器,对象适配器,接口适配器。
秦怀杂货店
2022/02/15
1710
设计模式【6.1】-- 初探适配器模式
设计模式-模板模式
模板模式主要由抽象模板(Abstract Template)角色和具体模板(Concrete Template)角色组成。
架构狂人
2023/10/09
1840
设计模式-模板模式
设计模式-模板模式
当房子建好后,相同的房间规格,但是可以根据不同的需求进行不同的装修,有把天花板刷黄,有些刷绿,有些乱刷...这个很类似于设计模式中的模板模式,根据相同的模板生成出来后内部装修可以自定义。
逍遥壮士
2020/09/18
4500
设计模式-模板模式
设计模式——模板模式
设计模式——模板模式
Java架构师必看
2021/05/14
4230
设计模式——模板模式
前端的设计模式系列-模版模式
代码也写了几年了,设计模式处于看了忘,忘了看的状态,最近对设计模式有了点感觉,索性就再学习总结下吧。
windliang
2022/08/20
5190
前端的设计模式系列-模版模式
设计模式(十四):模板模式
设计模式(十四):模板模式
Java架构师必看
2021/04/13
2270
跟着GPT学设计模式之模板模式
模板模式,全称是模板方法设计模式,英文是 Template Method Design Pattern。模板模式是一种行为型设计模式,它定义了一个操作中的算法骨架,将一些步骤的具体实现延迟到子类中。该模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。模板模式的核心思想是将一个算法的不变部分封装在一个模板方法中,将可变的部分留给子类去实现。
codetrend
2024/07/19
1270
九、委派模式与模板模式详解
委派模式(Delegate Pattern ) 又叫委托模式, 是一种面向对象的设计模式, 允许对象组合实现与 继承相同的代码重用。它的基本作用就是负责任务的调用和分配任务, 是一种特殊的静态代理, 可以理 解为全权代理, 但是代理模式注重过程,而委派模式注重结果。委派模式属于行为型模式, 不属于GO F 23 种设计模式中。
编程之心
2020/08/12
7590
九、委派模式与模板模式详解
【设计模式系列】行为型之模板模式
1.模板模式:定义一个操作算法中的框架,而将这些步骤延迟加载到子类中。 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤;
沁溪源
2020/11/04
3200
设计模式【7】-- 探索一下桥接模式
桥接模式是把抽象化和实现化解耦,让两者可以独立,该设计模式属于结构性设计模式。何为将抽象化和实现化解耦,可以理解为将功能点抽象出来,功能的实现如何取决于不同的需求,但是抽象的功能点(接口)已经被桥接到原本的类型上,只用关注与实现。原本的类型变化,和抽象的功能点可以自由变化,中间的桥梁已经搭建起来了。
秦怀杂货店
2022/02/15
2900
设计模式【7】-- 探索一下桥接模式
Java设计模式之模板模式
基本概念 模板方法模式,又叫模板模式。在一个抽象类中公开定义了执行它的方法的模板,它的子类可以按需重写方法实现,但调用将以抽象类中定义的方式进行。 简单说,模板模式定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构,就可以重定义该算法的某些特定步骤。 这种类型的设计模式属于行为型模式。 案例 编写制作豆浆的程序,说明如下: 制作豆浆的流程:选材—>添加配料—>浸泡—>放到豆浆机打碎。 通过添加不同的配料,可以制作出不同口味的豆浆。 选材、浸泡和放到豆浆机打碎这几个
shaoshaossm
2022/12/27
2520
Java设计模式之模板模式
设计模式【11】-- 组合模式的两种写法了解一下
其实,组合模式,又称为部分整体模式,用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
秦怀杂货店
2022/02/15
2710
设计模式【11】-- 组合模式的两种写法了解一下
设计模式 - 模板模式 - JavaScript
模板模式是:抽象父类定义了子类需要重写的相关方法。并且这些方法,仍然是通过父类方法调用的。
心谭博客
2020/04/20
4970
java设计模式之模板模式,站在巨人的肩膀上成功
模板模式(Template Pattern),定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变算法的结构,只是重定义该算法的某些特定步骤。这种类型的设计模式属于行为型模式。
用户4361942
2019/05/24
1.4K0
CRUD很无聊?一起学设计模式吧!--模板模式​
模板方法(Template Method)模式的定义如下: 定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式。
JAVA日知录
2019/11/20
5110
CRUD很无聊?一起学设计模式吧!--模板模式​
图解Java设计模式之模板模式
1)制作豆浆的流程 选材 – 》添加配料 --》浸泡 --》放到豆浆机打碎 2)通过添加不同的配料,可以制作出不同口味的豆浆 3)选材、浸泡和放到豆浆机打碎这几个步骤对于每种口味的豆浆都是一样的 4)模版方法模式比较简单,很容易就想到这个方案,因此就直接使用。
海仔
2020/04/01
4310
图解Java设计模式之模板模式
相关推荐
设计模式【13】-- 模板模式怎么弄?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验