首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >详解设计模式:模版方法模式

详解设计模式:模版方法模式

作者头像
栗筝i
发布于 2022-12-05 00:29:17
发布于 2022-12-05 00:29:17
64000
代码可运行
举报
文章被收录于专栏:迁移内容迁移内容
运行总次数:0
代码可运行

模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。 模板方法模式 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 ~ 本片文章内容包括:关于模版方法模式、观察者模式 Demo、模版方法模式的应用(InputStream 中的模版方法模式)


文章目录


一、关于模版方法模式

1、关于模版方法模式

模板方法模式(Template Method Pattern)也被称为模板模式(Template Pattern),是在 GoF 23 种设计模式中定义了的行为型模式。

模板方法模式 定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

模板方法模式 核心:处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用模版方法模式,将这个节点的代码实现转移给子类完成。即:处理步骤在父类中定义好,具体的实现延迟到子类中定义。

2、关于模版方法模式的构成

模版方法模式主要由 2 种角色构成:

  • 抽象类/抽象模板(Abstract Class):负责给出一个算法的轮廓和骨架。它由一个模板方法和若干个基本方法构成
  • 具体子类/具体实现(Concrete Class):实现抽象类中所定义的抽象方法和钩子方法,它们是一个顶级逻辑的一个组成步骤
3、关于抽象模板的方法组成

抽象模板类,由一个模板方法和若干个基本方法构成:

模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法;

基本方法:是整个算法中的一个步骤,包含以下几种类型:

  • 抽象方法(abstract method):在抽象类中声明,由具体子类实现;
  • 具体方法(specific method):在抽象类中已经实现,在具体子类中可以继承或重写它;
  • 钩子方法:在抽象类中已经实现,包括用于判断的逻辑方法和需要子类重写的空方法两种。
4、关于模版方法模式的XML
5、关于模版方法模式的使用场景
  • 算法的整体步骤很固定,但其中个别部分易变时,这时候可以使用模板方法模式,将容易变的部分抽象出来,供子类实现。
  • 当多个子类存在公共的行为时,可以将其提取出来并集中到一个公共父类中以避免代码重复。首先,要识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  • 当需要控制子类的扩展时,模板方法只在特定点调用钩子操作,这样就只允许在这些点进行扩展。
6、关于模版方法模式的优缺点

# 模版方法模式的优点

  • 提高代码复用性,它封装了不变部分,扩展可变部分。它把认为是不变部分的算法封装到父类中实现,而把可变部分算法由子类继承实现,便于子类继续扩展。
  • 部分方法是由子类实现的,因此子类可以通过扩展方式增加相应的功能,符合开闭原则。

# 模版方法模式的缺点

  • 对每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,间接地增加了系统实现的复杂度。
  • 父类中的抽象方法由子类实现,子类执行的结果会影响父类的结果,这导致一种反向的控制结构,它提高了代码阅读的难度。
  • 由于继承关系自身的缺点,如果父类添加新的抽象方法,则所有子类都要改一遍。

二、观察者模式 Demo

1、Demo 设计

炒菜的步骤是固定的,我们可以将其简化为倒油、热油、下蔬菜、下酱料、翻炒等步骤,现通过模板方法模式来用代码模拟。

Demo 类图如下:

2、Demo 实现

# AbstractClass 抽象模板类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class AbstractClass {
    
    /**
     * 模板方法
     */
    public final void cookProcess() {
        //第一步:倒油
        this.pourOil();
        //第二步:热油
        this.heatOil();
        //第三步:倒蔬菜
        this.pourVegetable();
        //第四步:倒调味料
        this.pourSauce();
        //第五步:翻炒
        this.fry();
    }

    /**
     * 第一步:倒油 具体方法,直接实现
     */
    public void pourOil() {
        System.out.println("倒油");
    }

    /**
     * 第二步:热油 具体方法,直接实现
     */
    public void heatOil() {
        System.out.println("热油");
    }

    /**
     * 第三步:倒蔬菜 抽象方法
     */
    public abstract void pourVegetable();

    /**
     * 第四步:倒调料 抽象方法
     */
    public abstract void pourSauce();

    /**
     * 第五步:翻炒 具体方法,直接实现
     */
    public void fry() {
        System.out.println("翻炒");
    }
}

# ConcreteClass 具体子类

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

    @Override
    public void pourVegetable() {
        System.out.println("下锅的蔬菜是包菜");
    }

    @Override
    public void pourSauce() {
        System.out.println("下锅的酱料是辣椒");
    }
}
public class ConcreteClass_CaiXin extends AbstractClass {

    @Override
    public void pourVegetable() {
        System.out.println("下锅的蔬菜是菜心");
    }

    @Override
    public void pourSauce() {
        System.out.println("下锅的酱料是蒜蓉");
    }
}
3、Demo 测试
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Client {
    public static void main(String[] args) {
        //炒手撕包菜
        ConcreteClass_BaoCai baoCai = new ConcreteClass_BaoCai();
        baoCai.cookProcess();

        //炒蒜蓉菜心
        ConcreteClass_CaiXin caiXin = new ConcreteClass_CaiXin();
        caiXin.cookProcess();
    }
}

三、模版方法模式的应用(InputStream 中的模版方法模式)

InputStream 类就使用了模板方法模式。在 InputStream 类中定义了多个 read() 方法,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public abstract class InputStream implements Closeable {
    // 抽象方法,要求子类必须重写
    public abstract int read() throws IOException;

    public int read(byte b[]) throws IOException {
        return read(b, 0, b.length);
    }

	  // 模板方法
    public int read(byte b[], int off, int len) throws IOException {
        if (b == null) {
            throw new NullPointerException();
        } else if (off < 0 || len < 0 || len > b.length - off) {
            throw new IndexOutOfBoundsException();
        } else if (len == 0) {
            return 0;
        }

        int c = read(); //调用了无参的read方法,该方法是每次读取一个字节数据
        if (c == -1) {
            return -1;
        }
        b[off] = (byte)c;

        int i = 1;
        try {
            for (; i < len ; i++) {
                c = read();
                if (c == -1) {
                    break;
                }
                b[off + i] = (byte)c;
            }
        } catch (IOException ee) {
        }
        return i;
    }
}

在 InputStream 父类中已经定义好了读取一个字节数组数据的方法是每次读取一个字节,并将其存储到数组的第一个索引位置,读取 len 个字节数据。具体如何读取一个字节数据呢?由子类实现。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-12-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
模板方法模式(Template Method) - 最易懂的设计模式解析
b. 使用步骤 步骤1: 创建抽象模板结构(Abstract Class):炒菜的步骤
Carson.Ho
2019/02/22
7330
Carson带你学设计模式:模板方法模式(Template Method)
b. 使用步骤 步骤1: 创建抽象模板结构(Abstract Class):炒菜的步骤
Carson.Ho
2022/03/25
2470
Carson带你学设计模式:模板方法模式(Template Method)
谈谈模板方法设计模式的使用
在项目中经常会遇到一个类的某些方法和另一个类的某些方法功能是相同的,只有部分方法是不同的。这个时候就可以使用模板方法来操作了。其实这种情况很常见:比如我们项目里面用到的基类,BaseActivity之类的。这种设计就是模板方法,是不是有点熟悉。。。下面来看看是怎么实现的把。 模版方法模式的结构   模版方法模式由一个抽象类和一个(或一组)实现类通过继承结构组成,抽象类中的方法分为三种:   抽象方法:父类中只声明但不加以实现,而是定义好规范,然后由它的子类去实现。   模版方法:由抽象类声明并加以实现。一
竹清
2018/08/31
5630
设计模式(十三):行为型之模板方法模式
InputStream类就使用了模板方法模式。在InputStream类中定义了多个 read() 方法,如下:
Java微观世界
2025/01/21
1180
设计模式(十三):行为型之模板方法模式
【一起学系列】之模板方法:写SSO我只要5分钟
定义一个操作中的算法的骨架,将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤
Kerwin
2020/07/30
4470
【一起学系列】之模板方法:写SSO我只要5分钟
设计模式(九)模版方法模式
1.模版方法模式简介 模版方法模式介绍 在软件开发中,有时会遇到类似的情况,某个方法的实现需要多个步骤,其中有些步骤是固定的,而有些步骤并不固定,存在可变性。为了提高代码的复用性和系统的灵活性,可以使
用户1269200
2018/02/01
6240
设计模式(九)模版方法模式
设计模式之九(模版方法模式)
模版方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
aehyok
2018/09/11
3120
设计模式之九(模版方法模式)
设计模式学习之模版方法模式
模板方法模式是一种基于继承的代码复用的行为型模式;在其结构中只存在父类与子类之间的继承关系。通过使用模板方法模式,可以将一些复杂流程的实现步骤封装在一系列基本方法中,在抽象父类中提供一个称之为模板方法的方法来定义这些基本方法的执行次序,而通过其子类来覆盖某些步骤,从而使得相同的算法框架可以有不同的执行结果。本篇博客我们一起来学习模版方法模式。
老马的编程之旅
2022/06/22
2900
设计模式学习之模版方法模式
java行为型模式之模版方法模式
模版方法模式是最为常见的几种设计模式之一,而且你在工作中很可能已经使用过模板方法模式而你却没有意识到自己已经使用过这种模式,模版方法模式需要抽象类和具体子类协调完成,抽象类负责给出一个算法的轮廓和骨架,具体子类负责给出这个算法的各个逻辑步骤既具体子类负责填充这个轮廓和骨架,不同的子类有不同的填充方法;而将这些基本方法总汇起来的方法叫做模版方法,这个模板方法是在抽象类中以具体方法定义的
IT工作者
2022/05/09
2810
一篇文章带你了解设计模式——行为型模式
在之前的文章我们已经介绍了设计模式中的创建者模式和结构型模式,下面我们来介绍最后一部分行为型模式
秋落雨微凉
2023/03/08
4900
一篇文章带你了解设计模式——行为型模式
设计模式03——Template Method模式
模板方法(Template Method)模式就是带有模板功能的模式 ,组成模板方法的方法被定义在父类中,这些方法是抽象方法,在模板方法中规定了这些方法的执行流程,这些抽象方法需要子类来具体实现。换句话说,模板方法就是定义好了模板,也就是一定的流程,至于各个抽象方法的具体实现,则有子类们自己决定,所以查看父类的代码是无法知晓这些方法最终会进行何种具体处理,唯一知道的就是父类是如何调用这些方法的。
itlemon
2020/04/03
8520
设计模式03——Template Method模式
精讲设计模式【模版方法设计模式】
源码下载 https://logaaaaa.oss-cn-beijing.aliyuncs.com/com.gtf-1654655556486.zip
高大北
2022/06/14
2570
模板方法模式(Template Method)
模板方法模式(Template Method) 定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。 类图: 模板方法模式是编程中经常用到
qubianzhong
2019/07/01
4930
模板方法模式(Template Method)
设计模式之—模版方法模式
这种模式在我们开发中经常会用到,一个简单的例子,我们在抽象类中定义若干个基本的操作,在具体的实现类中定义模版方法对基本方法实现聚合。这种实现方式就可以称为模版方法模式
代码改变世界-coding
2018/09/27
3860
设计模式之—模版方法模式
JAVA设计模式12:模版方法模式,将一些步骤延迟到子类中实现
模板方法模式是一种行为设计模式,它定义了一个操作中的算法的框架,将一些步骤延迟到子类中实现。在模板方法模式中,父类定义了一个模板方法,该方法提供了一个通用的算法框架,其中包含了一系列的步骤,而这些步骤的具体实现可以由子类进行重写。
Designer 小郑
2023/10/17
3270
JAVA设计模式12:模版方法模式,将一些步骤延迟到子类中实现
模板方法模式
概述 概念:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。模板方法模式属于行为类模式。 模板方法的组成 类图: 如图所示
xiangzhihong
2018/02/05
7210
模板方法模式
图解Java设计模式之模板模式
1)制作豆浆的流程 选材 – 》添加配料 --》浸泡 --》放到豆浆机打碎 2)通过添加不同的配料,可以制作出不同口味的豆浆 3)选材、浸泡和放到豆浆机打碎这几个步骤对于每种口味的豆浆都是一样的 4)模版方法模式比较简单,很容易就想到这个方案,因此就直接使用。
海仔
2020/04/01
4500
图解Java设计模式之模板模式
漫谈模式之模版方法模式
模板方法模式是一种行为型模式,它定义了一个算法的骨架,将算法的某些步骤延迟到子类中实现。该模式在超类中定义算法的结构,而在子类中实现算法的具体步骤,从而使得子类可以改变算法的具体实现,但不改变算法的整体结构。
孟君
2023/03/26
3140
『设计模式』瑞幸咖啡还是星巴克,一杯下午茶让我明白 设计模式--模板方法模式(Template Method Pattern)
主要解决 当完成一个操作具有固定的流程时,由抽象固定流程步骤,具体步骤交给子类进行具体实现(固定的流程,不同的实现)。
风骨散人Chiam
2020/10/28
4360
设计模式4之模板方法模式
在开发中,你肯定有遇到过这样一种场景:你知道某个方法的关键步骤以及执行顺序,但是里面有的具体步骤并清楚。你会怎么做?
Lvshen
2022/05/05
2050
设计模式4之模板方法模式
相关推荐
模板方法模式(Template Method) - 最易懂的设计模式解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档