Go设计模式之模板方法模式讲解和代码示例_Golang_脚本之家

Go设计模式之模板方法模式讲解和代码示例

 更新时间:2023年08月24日 08:21:09   作者:demo007x  
模版方法是一种行为设计模式, 它在基类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤,本文将通过代码示例给大家详细的介绍一下Go模板方法模式,需要的朋友可以参考下

Go 模板方法模式讲解和代码示例

模版方法是一种行为设计模式, 它在基类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。

概念示例

让我们来考虑一个一次性密码功能 (OTP) 的例子。 将 OTP 传递给用户的方式多种多样 (短信、 邮件等)。 但无论是短信还是邮件, 整个 OTP 流程都是相同的:

  • 生成随机的 n 位数字。
  • 在缓存中保存这组数字以便进行后续验证。
  • 准备内容。
  • 发送通知。

后续引入的任何新 OTP 类型都很有可能需要进行相同的上述步骤。

因此, 我们会有这样的一个场景, 其中某个特定操作的步骤是相同的, 但实现方式却可能有所不同。 这正是适合考虑使用模板方法模式的情况。

首先, 我们定义一个由固定数量的方法组成的基础模板算法。 这就是我们的模板方法。 然后我们将实现每一个步骤方法, 但不会改变模板方法。

otp.go: 模板方法

package main
type IOtp interface {
	genRandomOPT(int) string
	saveOPTCache(string)
	getMessage(string) string
	sendNotification(string) error
}
type Otp struct {
	iOtp IOtp
}
func (o *Otp) genAndSendOPT(optLength int) error {
	opt := o.iOtp.genRandomOPT(optLength)
	o.iOtp.saveOPTCache(opt)
	message := o.iOtp.getMessage(opt)
	if err := o.iOtp.sendNotification(message); err != nil {
		return err
	}
	return nil
}

sms.go: 具体实施

package main
import (
	"fmt"
)
type Sms struct {
	Otp
}
func (s *Sms) genRandomOPT(len int) string {
	randomOTP := "1234"
	fmt.Printf("SMS: generating random otp %s \n", randomOTP)
	return randomOTP
}
func (s *Sms) saveOPTCache(otp string) {
	fmt.Printf("SMS: saving otp %s", otp)
}
func (s *Sms) getMessage(otp string) string {
	return "SMS OTP for login is " + otp
}
func (s *Sms) sendNotification(message string) error {
	fmt.Printf("SMS: sending sms: %s\n", message)
	return nil
}

email.go: 具体实施

package main
import (
	"fmt"
)
type Email struct {
	Otp
}
func (s *Email) genRandomOPT(len int) string {
	randomOTP := "2345"
	fmt.Printf("Email: generating random otp %s \n", randomOTP)
	return randomOTP
}
func (s *Email) saveOPTCache(otp string) {
	fmt.Printf("Email: saving otp %s to cache", otp)
}
func (s *Email) getMessage(otp string) string {
	return "Email otp for login is " + otp
}
func (s *Email) sendNotification(message string) error {
	fmt.Printf("Email: sending email %s \n", message)
	return nil
}

main.go: 客户端代码

package main
import "fmt"
func main() {
	smsOTP := &Sms{}
	o := Otp{
		iOtp: smsOTP,
	}
	o.genAndSendOPT(4)
	fmt.Println("")
	emailOtp := &Email{}
	o = Otp{
		iOtp: emailOtp,
	}
	o.genAndSendOPT(4)
}

output.txt: 执行结果

SMS: generating random otp 1234 
SMS: saving otp 1234SMS: sending sms: SMS OTP for login is 1234

Email: generating random otp 2345 
Email: saving otp 2345 to cacheEmail: sending email Email otp for login is 2345 

到此这篇关于Go设计模式之模板方法模式讲解和代码示例的文章就介绍到这了,更多相关Go模板方法模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go语言中int和byte转换方式

    go语言中int和byte转换方式

    这篇文章主要介绍了go语言中int和byte转换方式,需要的朋友可以参考下
    2018-11-11
  • Go io/fs.FileMode文件系统基本操作和权限管理深入理解

    Go io/fs.FileMode文件系统基本操作和权限管理深入理解

    这篇文章主要为大家介绍了Go io/fs.FileMode文件系统基本操作和权限管理深入理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 详解go语言单链表及其常用方法的实现

    详解go语言单链表及其常用方法的实现

    这篇文章主要介绍了详解go语言单链表及其常用方法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Go语言字符串高效拼接的实现

    Go语言字符串高效拼接的实现

    这篇文章主要介绍了Go语言字符串高效拼接的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Golang利用位运算实现为程序加速

    Golang利用位运算实现为程序加速

    这篇文章主要为大家详细介绍了如何在Golang中利用位运算实现为程序加速功能,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-08-08
  • 使用 pprof 进行性能分析的方法详解

    使用 pprof 进行性能分析的方法详解

    pprof 是 Go 语言中用于性能分析的一个强大工具,它可以帮助开发人员找到应用程序中的性能瓶颈,并提供详细的分析报告,本文将介绍如何使用 pprof 进行性能分析,需要的朋友可以参考下
    2023-05-05
  • Golang常用包使用介绍

    Golang常用包使用介绍

    标准的Go语言代码库中包含了大量的包,并且在安装Go的时候多数会自动安装到系统中。我们可以在$GOROOT/src/pkg目录中查看这些包。下面简单介绍一些我们开发中常用的包
    2022-09-09
  • 减少 golang 二进制文件大小操作

    减少 golang 二进制文件大小操作

    这篇文章主要介绍了减少 golang 二进制文件大小操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • go for range遍历二维数组的示例

    go for range遍历二维数组的示例

    今天小编就为大家分享一篇关于go for range遍历二维数组的示例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • 一文详解如何在Golang中实现JWT认证与授权

    一文详解如何在Golang中实现JWT认证与授权

    在现代Web应用中,安全性是一个非常重要的课题,JWT作为一种常用的认证与授权机制,已被广泛应用于各种系统中,下面我们就来看看如何在Golang中实现JWT认证与授权吧
    2025-03-03

最新评论