golang设计模式图解——模板方法模式

设计模式

GoF提出的设计模式有23个,包括:
(1)创建型(Creational)模式:如何创建对象;
(2)结构型(Structural )模式:如何实现类或对象的组合;
(3)行为型(Behavioral)模式:类或对象怎样交互以及怎样分配职责。

在这里插入图片描述

行为型模式

模板方法模式

模版方法模式使用继承机制,把通用步骤和通用方法放到父类中,把具体实现延迟到子类中实现。使得实现符合开闭原则。

如实例代码中通用步骤在父类中实现(煮开水冲泡倒入杯中添加酌料)煮开水和冲泡的具体实现留到子类中,并且提供 保存方法的默认实现。

因为Golang不提供继承机制,需要使用匿名组合模拟实现继承。

此处需要注意:因为父类需要调用子类方法,所以子类需要匿名组合父类的同时,父类需要持有子类的引用。

父类

package mainimport "fmt"//抽象类,制作饮料,包裹一个模板的全部实现步骤
type Beverage interface {BoilWater() //煮开水Brew()      //冲泡PourInCup() //倒入杯中AddThings() //添加酌料WantAddThings() bool //是否加入酌料Hook
}//封装一套流程模板,让具体的制作流程继承且实现
type template struct {b Beverage
}//封装的固定模板
func (t *template) MakeBeverage() {if t == nil {return}t.b.BoilWater()t.b.Brew()t.b.PourInCup()//子类可以重写该方法来决定是否执行下面动作if t.b.WantAddThings() == true {t.b.AddThings()}
}

子类
在这里插入图片描述
测试

func main() {//1. 制作一杯咖啡makeCoffee := NewMakeCaffee()makeCoffee.MakeBeverage() //调用固定模板方法fmt.Println("------------")//2. 制作茶makeTea := NewMakeTea()makeTea.MakeBeverage()
}

参考

Easy 搞定 Golang设计模式

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

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

相关文章

【JavaSE】反射

Java代码的生命周期 Java代码在计算机中经历的阶段:Source源代码阶段、Class类对象阶段、RunTime运行时阶段。 Source源代码阶段: 这个阶段是由程序员编写生成源代码,再由Javac编译器生成class文件。 Class类对象阶段:由类加载器将class文件加载到JVM内…

【网站项目】少儿编程管理系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

备战蓝桥杯---多路归并与归并排序刷题

话不多说,直接看题 1. 我们考虑一行一行合并,一共m次,我们合并两个并取前n小,那么我们怎么取? 我们采用分组的思想: 我们选第一列的min,然后把后面那个再纳入考虑,用优先队列实现即可。 下面…

chatGPT4无法登录

遇到问题:chatgpt网站上点击登录(log in),网站就会跳转并显示:unable to connect 解决方法:不要用亚洲节点,亚洲节点被全面封禁,在全局代理中可以换成美国的节点

synchronized到底锁住的是谁?

我们使用synchronized关键字是用来实现线程同步的,当多个线程同时去争抢同一个资源的时候在资源上边加一个synchronized关键字,能够使得线程排队去完成操作。 synchronized到底锁定的是什么资源? 修饰方法非静态方法 ,锁定的是方…

《UE5_C++多人TPS完整教程》学习笔记30 ——《P31 摄像机和弹簧臂(Camera And Spring Arm)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P31 摄像机和弹簧臂(Camera And Spring Arm)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版,UP主(…

使用git 和 github协作开发

文章目录 github浏览器汉化插件github新建仓库git安装以及ssh配置团队创建及基本命令的使用创建团队基本命令 分支管理快速切换远程仓库地址 如何使用git && github进行协作开发,包括git常见基础命令 github浏览器汉化插件 在刚开始使用github的时候&#…

ubuntu安装docker,并搭建vulfocus靶场

ubuntu安装docker,并搭建vulfocus靶场 docker是一个容器管理的软件,容器背后其实就是一个进程;类似于一个集装箱。 docker的官方下载地址:Install Docker Engine on Ubuntu | Docker Documentation(可以根据自己需要的…

【文献分享】机器学习 + 分子动力学 + 第一性原理 + 热力学性质 + 微观结构

分享一篇关于机器学习 分子动力学 第一性原理 热学性质(密度、比热容、导热率和粘度) 微观结构的文章。 感谢论文的原作者! 关键词: 1. Deep potential 2. Machine learning 3. Molecular dynamics 4. Microscopic structu…

Linux| Awk 中“next”命令奇用

简介 本文[1]介绍了在Linux中使用Awk的next命令来跳过剩余的模式和表达式,读取下一行输入的方法。 next命令 在 Awk 系列教程中,本文要讲解如何使用 next 命令。这个命令能让 Awk 跳过所有你已经设置的其他模式和表达式,直接读取下一行数据。…

【无标题】【Android】Android中Intent的用法总结

2.显示地图: Java代码 Uri uri Uri.parse(“geo:38.899533,-77.036476”); Intent it new Intent(Intent.Action_VIEW,uri); startActivity(it); 3.从google搜索内容 Java代码 Intent intent new Intent(); intent.setAction(Intent.ACTION_WEB_SEARCH); intent.pu…

【C++进阶】【STL】set和map的讲解及模拟实现

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:c大冒险 总有光环在陨落,总有新星在闪烁 一、 关联式容器 在初阶阶…

github中git clone需要username和password问题

username:一般指你的昵称 password:一般指Creating a fine-grained personal access token 这个的获取办法如下(注意,在11步的时候,记得打开你仓库对应的一些access 权限): Note: Fine-graine…

动态规划刷题(算法竞赛、蓝桥杯)--线段(线性DP)

1、题目链接&#xff1a;P3842 [TJOI2007] 线段 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <bits/stdc.h> using namespace std; const int N20010; int a[N][2],f[N][2]; //a[i][0]表示l[i],a[i][1]表示r[i] int dis(int a,int b){return abs(a-b); } int…

Java中的网络编程(一)

一、网络编程概述 什么是计算机网络把不同区域的计算机&#xff08;广义&#xff09;通过通信设备和线路连接&#xff0c;可以实现数据的传输和共享的系统。实现不同计算机之间的练习&#xff0c;必须有介质连接。网络编程是干什么的聊天-->聊天软件 QQjava语言是支持网络间…

从人机界面设计黄金三法则视角看 ChatGPT 的界面设计的“好”与“坏”

热门文章推荐&#xff1a; &#xff08;1&#xff09;《为什么很多人工作 3 年 却只有 1 年经验&#xff1f;》&#xff08;2&#xff09;《一文掌握大模型提示词技巧&#xff1a;从战略到战术巧》&#xff08;3&#xff09;《AI 时代&#xff0c;程序员的出路在何方&#xff1…

数组方法汇总

数组和链表类似&#xff0c;都是用双指针&#xff0c;但数组不需要额外的指针&#xff0c;可以使用索引来当作指针。&#xff08;链表的时候要注意&#xff0c;什么时候是移动的指针&#xff0c;什么时候是改变的节点&#xff09;删除有序数组中的重复项 注意&#xff0c;本题中…

36.基于CAS实现的java类

JUC, java.util.concurrent并发工具包下。 1.原子整数 AtomicInteger AtomicLong AtomicBoolean 底层用的CAS来实现。 AtomicInteger类的incrementAndGet方法&#xff0c;addAndGet方法 public static void main(String[] args) {AtomicInteger atomicInteger new Atom…

Coursera自然语言处理专项课程04:Natural Language Processing with Attention Models笔记 Week01

Natural Language Processing with Attention Models Course Certificate 本文是学习这门课 Natural Language Processing with Attention Models的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 Natural Language Processing with Attention ModelsWeek 01…

c# wpf style 简单试验

1.概要 wpf style 用来控制控件的样式 2.代码 <Window x:Class"WpfApp2.Window5"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.…