欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go設(shè)計(jì)模式之模板方法模式講解和代碼示例

 更新時間:2023年08月24日 08:21:09   作者:demo007x  
模版方法是一種行為設(shè)計(jì)模式, 它在基類中定義了一個算法的框架, 允許子類在不修改結(jié)構(gòu)的情況下重寫算法的特定步驟,本文將通過代碼示例給大家詳細(xì)的介紹一下Go模板方法模式,需要的朋友可以參考下

Go 模板方法模式講解和代碼示例

模版方法是一種行為設(shè)計(jì)模式, 它在基類中定義了一個算法的框架, 允許子類在不修改結(jié)構(gòu)的情況下重寫算法的特定步驟。

概念示例

讓我們來考慮一個一次性密碼功能 (OTP) 的例子。 將 OTP 傳遞給用戶的方式多種多樣 (短信、 郵件等)。 但無論是短信還是郵件, 整個 OTP 流程都是相同的:

  • 生成隨機(jī)的 n 位數(shù)字。
  • 在緩存中保存這組數(shù)字以便進(jìn)行后續(xù)驗(yàn)證。
  • 準(zhǔn)備內(nèi)容。
  • 發(fā)送通知。

后續(xù)引入的任何新 OTP 類型都很有可能需要進(jìn)行相同的上述步驟。

因此, 我們會有這樣的一個場景, 其中某個特定操作的步驟是相同的, 但實(shí)現(xiàn)方式卻可能有所不同。 這正是適合考慮使用模板方法模式的情況。

首先, 我們定義一個由固定數(shù)量的方法組成的基礎(chǔ)模板算法。 這就是我們的模板方法。 然后我們將實(shí)現(xiàn)每一個步驟方法, 但不會改變模板方法。

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: 具體實(shí)施

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: 具體實(shí)施

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: 執(zhí)行結(jié)果

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 

到此這篇關(guān)于Go設(shè)計(jì)模式之模板方法模式講解和代碼示例的文章就介紹到這了,更多相關(guān)Go模板方法模式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go語言中int和byte轉(zhuǎn)換方式

    go語言中int和byte轉(zhuǎn)換方式

    這篇文章主要介紹了go語言中int和byte轉(zhuǎn)換方式,需要的朋友可以參考下
    2018-11-11
  • Go?io/fs.FileMode文件系統(tǒng)基本操作和權(quán)限管理深入理解

    Go?io/fs.FileMode文件系統(tǒng)基本操作和權(quán)限管理深入理解

    這篇文章主要為大家介紹了Go?io/fs.FileMode文件系統(tǒng)基本操作和權(quán)限管理深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 詳解go語言單鏈表及其常用方法的實(shí)現(xiàn)

    詳解go語言單鏈表及其常用方法的實(shí)現(xiàn)

    這篇文章主要介紹了詳解go語言單鏈表及其常用方法的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Go語言字符串高效拼接的實(shí)現(xiàn)

    Go語言字符串高效拼接的實(shí)現(xiàn)

    這篇文章主要介紹了Go語言字符串高效拼接的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • Golang利用位運(yùn)算實(shí)現(xiàn)為程序加速

    Golang利用位運(yùn)算實(shí)現(xiàn)為程序加速

    這篇文章主要為大家詳細(xì)介紹了如何在Golang中利用位運(yùn)算實(shí)現(xiàn)為程序加速功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-08-08
  • 使用?pprof?進(jìn)行性能分析的方法詳解

    使用?pprof?進(jìn)行性能分析的方法詳解

    pprof?是?Go?語言中用于性能分析的一個強(qiáng)大工具,它可以幫助開發(fā)人員找到應(yīng)用程序中的性能瓶頸,并提供詳細(xì)的分析報告,本文將介紹如何使用?pprof?進(jìn)行性能分析,需要的朋友可以參考下
    2023-05-05
  • Golang常用包使用介紹

    Golang常用包使用介紹

    標(biāo)準(zhǔn)的Go語言代碼庫中包含了大量的包,并且在安裝Go的時候多數(shù)會自動安裝到系統(tǒng)中。我們可以在$GOROOT/src/pkg目錄中查看這些包。下面簡單介紹一些我們開發(fā)中常用的包
    2022-09-09
  • 減少 golang 二進(jìn)制文件大小操作

    減少 golang 二進(jìn)制文件大小操作

    這篇文章主要介紹了減少 golang 二進(jìn)制文件大小操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go for range遍歷二維數(shù)組的示例

    go for range遍歷二維數(shù)組的示例

    今天小編就為大家分享一篇關(guān)于go for range遍歷二維數(shù)組的示例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • 一文詳解如何在Golang中實(shí)現(xiàn)JWT認(rèn)證與授權(quán)

    一文詳解如何在Golang中實(shí)現(xiàn)JWT認(rèn)證與授權(quán)

    在現(xiàn)代Web應(yīng)用中,安全性是一個非常重要的課題,JWT作為一種常用的認(rèn)證與授權(quán)機(jī)制,已被廣泛應(yīng)用于各種系統(tǒng)中,下面我們就來看看如何在Golang中實(shí)現(xiàn)JWT認(rèn)證與授權(quán)吧
    2025-03-03

最新評論