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 xorm存库处理null值问题

    go xorm存库处理null值问题

    这篇文章主要介绍了go xorm存库处理null值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Golong字符串拼接性能优化及原理介绍

    Golong字符串拼接性能优化及原理介绍

    最近在做性能优化,有个函数里面的耗时特别长,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其实有很多种实现,下面这篇文章主要给大家介绍了关于Golang语言如何高效拼接字符串的相关资料,需要的朋友可以参考下
    2023-04-04
  • 解密Golang中Request对象的操作

    解密Golang中Request对象的操作

    这篇文章主要和大家深入探讨 Golang 中的 Request 对象,并从多个方面介绍其功能、结构和使用方法,文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-05-05
  • 详解Golang如何优雅接入多个远程配置中心

    详解Golang如何优雅接入多个远程配置中心

    这篇文章主要为大家为大家介绍了Golang如何优雅接入多个远程配置中心详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05
  • Go操作Kafka和Etcd方法详解

    Go操作Kafka和Etcd方法详解

    这篇文章主要为大家介绍了Go操作Kafka和Etcd方法详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 探索Golang实现Redis持久化AOF实例

    探索Golang实现Redis持久化AOF实例

    这篇文章主要为大家介绍了Golang实现Redis持久化AOF实例探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Golang加密解密之RSA(附带php)

    Golang加密解密之RSA(附带php)

    安全总是很重要的,各个语言对于通用的加密算法都会有实现。本文先是对RSA算法进行了简单介绍,后才进行介绍如何用Go实现RSA的加密解密,下面一起来看看吧。
    2016-08-08
  • Go Gin中间件的具体使用

    Go Gin中间件的具体使用

    中间件是Gin框架中的一个重要概念,它可以用来处理HTTP请求和响应,或者在处理请求之前和之后执行一些操作,本文主要介绍了Go Gin中间件的具体使用,感兴趣的可以了解一下
    2023-11-11
  • Golang标准库syscall详解(什么是系统调用)

    Golang标准库syscall详解(什么是系统调用)

    最近在研究go语言,发现go语言系统调用源码只有调用函数的定义,今天通过本文给大家分享Golang标准库syscall详解及什么是系统调用,感兴趣的朋友一起看看吧
    2021-05-05
  • Golang time.Sleep()用法及示例讲解

    Golang time.Sleep()用法及示例讲解

    Go语言中的Sleep()函数用于在至少规定的持续时间d内停止最新的go-routine,这篇文章主要介绍了Golang time.Sleep()用法及示例讲解,需要的朋友可以参考下
    2023-02-02

最新评论