三分钟理解“模板方法模式”——设计模式轻松掌握

模板方法模式的官方定义:

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

大白话讲:

当一个函数的流程都能够确定,但某些具体的步骤会根据情况的不同而不同。此时可以使用模板方法模式,将函数中能确定的部分都写出来,不确定的部分用本类中的抽象函数代替;当需要使用该函数时,需要创建一个实现该类中所有抽象函数的子类,当通过子类调用该算法时,当执行到算法中的抽象函数时,由于多态的特性,系统会自动调用子类中已经重写好的函数,从而整个算法都被执行了一遍。

模板方法的类图:

在类AbstractClass中,把模板函数templateMethod写好,并且把模板函数中不确定的步骤以抽象函数代替;当客户端要使用这个模板函数时,需要创建一个子类,并覆盖抽象类的抽象函数即可。

何时使用?

当多个地方要用到类似的功能的时候,一般的做法是这样:把代码复制过来,把某几个地方稍微修改一下。这种做法代码的复用率太低。

正确做法:将功能类似的部分封装到一个函数中,能确定的地方直接写上代码,不能确定的地方用抽象函数代替。

模板方法模式的优点:

当不变和可变的代码混合在一起的时候,如果多个地方需要用这段代码,需要将其复制粘贴,然后稍作修改,这样会导致不变的代码重复出现,导致了代码复用率低下。模板方法模式是将不变的行为搬到父类中,去除了子类中的重复代码,从而提高了代码的复用率。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android Note

Kotlin —  Destructuring Declarations(解构声明)

1192
来自专栏电光石火

PHP获取时间戳的毫秒

php获取时间的方式是time(); 那么如果是涉及需要精细的时间的应用,那么怎么获取呢? /** 获取当前时间戳,精确到毫秒 */ functi...

2829
来自专栏Python小屋

详解Python对象属性

在面向对象编程中,公开的数据成员可以在外部随意访问和修改,很难控制用户修改时新数据的合法性。解决这一问题的常用方法是定义私有数据成员,然后设计公开的成员方法来提...

3098
来自专栏知识分享

关于函数指针--简介

函数指针说白了,,,,函数的地址 现在看一个简单的--先定义一个函数指针 void (*f1)();就是这样定义--指向的是一个void类型的 假设定义了另一个...

2918
来自专栏林德熙的博客

C# const 和 readonly 有什么区别

在写常量的时候,是选择使用 const 还是 static readonly 是一个让人难以决定的问题,本文告诉大家这两个方法的区别。

942
来自专栏C语言及其他语言

[蓝桥杯]Hello, world!

题目描述 This is the first problem for test. Since all we know the ASCII code, your ...

3418
来自专栏阿凯的Excel

Python读书笔记17(while与列表、字典)

今天分享利用while函数处理列表和字典,顺便温习一下历史知识 一、论如何将一个列表折腾至另外一个列表!(两个列表是独立的) 论折腾列表有几种方法! 先分...

3625
来自专栏海天一树

小朋友学Python(3):布尔类型

本节讲解C/C++/Java/Python中的布尔类型。 一、C语言 C语言中没有布尔类型,判断时 ,0为假,非0为真。 二、C++ C++的bool是布尔类型...

28111
来自专栏代码世界

Python之内置函数

内置函数 python里的内置函数。截止到python版本3.6.2,现在python一共为我们提供了68个内置函数。它们就是python提供给你直接可以拿来使...

3067
来自专栏java学习

Java基础总结大全(1)

一、基础知识: 1、JVM、JRE和JDK的区别: JVM(Java Virtual Machine):java虚拟机,用于保证java的跨平台的特性。 ...

37411

扫码关注云+社区