《golang设计模式》第三部分·行为型模式-10-模板方法(Template Method)

文章目录

  • 1. 概述
    • 1.1 角色
    • 1.2 类图
  • 2. 代码示例
    • 2.1 设计
    • 2.2 代码
    • 2.3 类图

1. 概述

模板方法(Template Method)用来定义算法的框架,将算法中的可变步骤定义为抽象方法,指定子类实现或重写。

1.1 角色

  • AbstractClass(抽象类):用来定义算法框架和抽象操作
    • templateMethod()方法:使用final修饰,包含了不可变的算法,不允许子类重定义它。
    • invariantStep()方法,可见性为privat,子类不可见,也不能重定义。
    • variantStep():可见性是protected,允许子类继承和重定义。
  • ConcreteClass(具体实现类):用来实现算法框架中的某些步骤,完成与特定子类相关的功能

1.2 类图

AbstractClass
+templateMethod()
-invariantStep()
#variantStep()
ConcreteClass
#variantStep()

2. 代码示例

2.1 设计

  • 定义抽象类AbstractClass
    • 定义templateMethod()方法,包含了不可变的算法
    • 定义variantStep()方法,是可以被子类重写的方法
    • 定义invariantStep()方法,是抽象类的私有方法
      • 它应该是子类不可见的,但是go中无法真正实现,我们可以把它放到templateMethod()方法中执行,已达到子类视而不见的效果。
  • 定义具体实现类ConcreteClass
    • 它继承了抽象类AbstractClass
    • 它的方法variantStep()重写了父类的variantStep()方法
    • 它的Execute()是它的执行方法
  • 调用
    • 实例化抽象类abstractClass
    • 实例化具体实现类concreteClass,继承了抽象类abstractClass
    • 执行concreteClassExecute()方法
      • 它执行了concreteClass继承的templateMethod()方法
      • 它执行了重写的variantStep()方法
    • 打印测试结果

2.2 代码

  • 代码
package mainimport "fmt"// 定义抽象类
type AbstractClass struct {A int64B int64C int64
}// 不可重写的方法,由于golang中没有这种权限控制,我们只能人为规定不在子类中重写。
func (a *AbstractClass) templateMethod() {a.A = a.A + 10a.invariantStep()
}// 可重写的方法
func (a *AbstractClass) variantStep() {a.B = a.B + 10
}// 本来是java中私有方法,子类不可见。由于golang中没有这些权限设置,我们只能人为规定不能由其他类调用,因此我们把它放到不可重写方法templateMethod()中执行
func (a *AbstractClass) invariantStep() {a.C = a.C + 10
}func (a *AbstractClass) Get() {fmt.Printf("%+v", a)
}// 具体实现类
type ConcreteClass struct {*AbstractClass
}// 重写父类的variantStep方法
func (c *ConcreteClass) variantStep() {c.B = c.B - 10
}// 定义具体实现类的执行方法
func (c *ConcreteClass) Execute() {c.templateMethod()c.variantStep()
}func main() {//实例化抽象类abstractClass := &AbstractClass{A: 1,B: 1,C: 1,}//实例化具体实现类concreteClass := &ConcreteClass{AbstractClass: abstractClass,}//执行具体实现类的执行方法concreteClass.Execute()//查看结果concreteClass.Get()
}
  • 输出
&{A:11 B:-9 C:11}

2.3 类图

AbstractClass
+Int A
+Int B
+templateMethod()
-invariantStep()
#variantStep()
+Get()
ConcreteClass
#variantStep()
+Execute()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/656759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kettle-Docker部署+Sqlserver数据同步Mysql+Start定时任务

一. 背景介绍 1. ETL是什么 ETL(Extract-Transform-Load),即数据抽取、转换、装载的过程。它是一种思想,主要是说,从不同的数据源获取数据,并通过对数据进行处理(格式,协议等转换&a…

第32关 k8s集群管理开源神器 - k9s

------> 课程视频同步分享在今日头条和B站 大家好,我是博哥爱运维。 随着我们管理维护的K8S集群上线,怎么管理好集群上面成百上千的服务pod,就是我们该操心的事情了。这里博哥把在生产中一直在用的一个开源管理工具k8s,github…

Jenkins如何从GIT下拉项目并启动Tomcat

一、先添加服务器 二、添加视图 点击控制台输出,滑到最下面,出现这个就说明构建成功了,如果没有出现,说明构建有问题,需要解决好问题才能启动哦~

C++实现通讯录管理系统

目录 1、系统需求 2、创建项目 2.1 创建项目 3、菜单功能 4、退出功能 5、添加联系人 5.1 设计联系人结构体 5.2 设计通讯录结构体 5.3 main函数中创建通讯录 5.4 封装联系人函数 5.5 测试添加联系人功能 6、显示联系人 6.1 封装显示联系人函数 7、删除联系人 7.1…

GPT栏目:yarn 安装

GPT栏目:yarn 安装 一、前言 在跟GPT交互的时候,发现最近gpt4给出的答案率有了比较明显的提高,简单记录一下,我用gpt4拿到的答案吧。 本人已按照这个步骤成功 二、具体步骤 要安装 yarn,你可以按照以下步骤进行操作…

MyBatis常见面试题汇总

说一下MyBatis执行流程? MyBatis是一款优秀的基于Java的持久层框架,它内部封装了JDBC,使开发者只需要关注SQL语句本身,而不需要花费精力去处理加载驱动、创建连接等的过程,MyBatis的执行流程如下: 加载配…

Google Chrome 常用的几个参数

1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新,因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…

【计算机网络】【练习题及解答】【新加坡南洋理工大学】【Computer Control Network】

说明: 仅供学习使用。 一、题目描述 题目共4问,描述网络通信中的 帧传输时延(Frame Delay)、传播时延(Propagation Delay),以及 链接利用率(Link Utilization) 的相关…

Vue2:通过代理服务器解决跨域问题

一、场景描述 现在的项目大多数是前后端分离的。Vue前端项目通过ajax去请求后端接口的时候,会有同源策略的限制。从而产生跨域问题。 二、基本概念 1、什么是同源策略? 就是前端服务和后端服务的协议名,IP或主机名,端口号不完…

0x02递推与递归

0x02递推与递归 递推者,自小而大,循序渐进;递归者,由上而下,分而治之 文章目录 0x02递推与递归例题T1:T2:T3:T4:T5T6 例题 T1: 92. 递归实现指数型枚举 - AcWing题库 …

Mysql 插入数据

1 为表的所有字段插入数据 使用基本的INSERT语句插入数据要求指定表名称和插入到新记录中的值。基本语法格式为: INSERT INTO table_name (column_list) VALUES (value_list); 使用INSERT插入数据时,允许列名称列表column_list为空,此时&…

Web服务器之Tomcat

文章目录 Web 服务器软件简介资源分类访问流程常见的Web服务器软件 Tomcat简介使用步骤使用Tomcat注意事项部署项目的方式方式一方式二方式三 问题中文乱码黑窗口一闪而过启动报错 Web 服务器软件 简介 服务器:安装了服务器软件的计算机服务器软件:接收…

漏洞原理远程命令执行

漏洞原理远程命令/代码执行 远程命令执行函数(Remote Command Execution Function)是指在一个网络环境中,通过远程执行命令来控制另一个计算机系统或设备的功能。 远程命令执行函数可以通过网络协议(如SSH、Telnet、RPC等&#x…

伊恩·斯图尔特《改变世界的17个方程》毕达哥拉斯定理笔记

它告诉我们什么? 直角三角形的三个边之间有什么关系。 为什么重要? 它提供了几何和代数之间的重要联系,使我们能够根据坐标计算距离。它也催生出了三角学。 它带来了什么? 测绘、导航,以及较近代出现的狭义和广义相对论…

第一节课,用户管理--后端初始化,项目调通。二次翻工2

一、网址来源: 快速开始 | MyBatis-Plus (baomidou.com) 进程: ​ 二、[此处不看]添加测试类,看下效果 2.1 参考 一、第一节课,用户管理--后端初始化,项目调通-CSDN博客 ​ 2.2 新建 SampleTest ​ 2.3 复…

python-自动化篇-运维-语音识别

文章目录 理论文本转换为语音使用 pyttsx使用 SAPI使用 SpeechLib 语音转换为文本 代码和效果01使用pyttsx实现文本_语音02使用SAPI实现文本_语音03使用SpeechLib实现文本_语音04使用PocketSphinx实现语音转换文本 理论 语音识别技术,也被称为自动语音识别&#xf…

安卓逆向学习之ADB的配置和使用及刷机root

ADB的配置和使用 ADB即Android Debug Bridge,安卓调试桥,是谷歌为安卓开发者提供的开发工具之一,可以让你的电脑以指令窗口的方式控制手机。可以在安卓开发者网页中的 SDK 平台工具页面下直接下载对应系统的 adb 配置文件,大小只…

矩阵键盘的使用

在定义局部变量时,一定要给该变量赋初值。在这个程序中,给按键按下的返回值变量 KeyNum 赋值为 20 。 矩阵键盘线行扫描法的学习链接:https://www.bilibili.com/video/BV1dv411z7Gd/?spm_id_from333.999.0.0&vd_sourceb91967c499b23106…

Python 因果推断(上)

引言 原文:causal-methods.github.io/Book/Introduction.html 译者:飞龙 协议:CC BY-NC-SA 4.0 作者:Vitor Kamada 电子邮件:econometrics.methodsgmail.com 最后更新日期:2020 年 8 月 15 日 这本书是使…

jupyter出现问题ModuleNotFoundError: No module named ‘exceptiongroup‘

今天使用pyg的jupyter环境发现这个环境没法用, 所以只能把这个kernel给重删了然后再装,操作记录如下 查看kernel jupyter kernelspec list注意不是jupyter kernel --list 需要加关键字spec, 删除kernel jupyter kernelspec remove pyg当重新安装这个kernel时可能…