最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

概念示例

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

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

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

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

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

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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go xorm存庫處理null值問題

    go xorm存庫處理null值問題

    這篇文章主要介紹了go xorm存庫處理null值問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Golong字符串拼接性能優(yōu)化及原理介紹

    Golong字符串拼接性能優(yōu)化及原理介紹

    最近在做性能優(yōu)化,有個(gè)函數(shù)里面的耗時(shí)特別長,看里面的操作大多是一些字符串拼接的操作,而字符串拼接在 golang 里面其實(shí)有很多種實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于Golang語言如何高效拼接字符串的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • 解密Golang中Request對(duì)象的操作

    解密Golang中Request對(duì)象的操作

    這篇文章主要和大家深入探討?Golang?中的?Request?對(duì)象,并從多個(gè)方面介紹其功能、結(jié)構(gòu)和使用方法,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-05-05
  • 詳解Golang如何優(yōu)雅接入多個(gè)遠(yuǎn)程配置中心

    詳解Golang如何優(yōu)雅接入多個(gè)遠(yuǎn)程配置中心

    這篇文章主要為大家為大家介紹了Golang如何優(yōu)雅接入多個(gè)遠(yuǎn)程配置中心詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Go操作Kafka和Etcd方法詳解

    Go操作Kafka和Etcd方法詳解

    這篇文章主要為大家介紹了Go操作Kafka和Etcd方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 探索Golang實(shí)現(xiàn)Redis持久化AOF實(shí)例

    探索Golang實(shí)現(xiàn)Redis持久化AOF實(shí)例

    這篇文章主要為大家介紹了Golang實(shí)現(xiàn)Redis持久化AOF實(shí)例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Golang加密解密之RSA(附帶php)

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

    安全總是很重要的,各個(gè)語言對(duì)于通用的加密算法都會(huì)有實(shí)現(xiàn)。本文先是對(duì)RSA算法進(jìn)行了簡單介紹,后才進(jìn)行介紹如何用Go實(shí)現(xiàn)RSA的加密解密,下面一起來看看吧。
    2016-08-08
  • Go Gin中間件的具體使用

    Go Gin中間件的具體使用

    中間件是Gin框架中的一個(gè)重要概念,它可以用來處理HTTP請(qǐng)求和響應(yīng),或者在處理請(qǐng)求之前和之后執(zhí)行一些操作,本文主要介紹了Go Gin中間件的具體使用,感興趣的可以了解一下
    2023-11-11
  • Golang標(biāo)準(zhǔn)庫syscall詳解(什么是系統(tǒng)調(diào)用)

    Golang標(biāo)準(zhǔn)庫syscall詳解(什么是系統(tǒng)調(diào)用)

    最近在研究go語言,發(fā)現(xiàn)go語言系統(tǒng)調(diào)用源碼只有調(diào)用函數(shù)的定義,今天通過本文給大家分享Golang標(biāo)準(zhǔn)庫syscall詳解及什么是系統(tǒng)調(diào)用,感興趣的朋友一起看看吧
    2021-05-05
  • Golang time.Sleep()用法及示例講解

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

    Go語言中的Sleep()函數(shù)用于在至少規(guī)定的持續(xù)時(shí)間d內(nèi)停止最新的go-routine,這篇文章主要介紹了Golang time.Sleep()用法及示例講解,需要的朋友可以參考下
    2023-02-02

最新評(píng)論

宝山区| 息烽县| 施甸县| 佛山市| 建阳市| 衡阳县| 广汉市| 南澳县| 连南| 扶沟县| 永城市| 长垣县| 建始县| 五大连池市| 化州市| 宜川县| 凯里市| 罗江县| 广宗县| 红桥区| 瑞金市| 柯坪县| 崇左市| 元谋县| 高阳县| 宁南县| 枣强县| 施甸县| 罗平县| 天水市| 射阳县| 徐汇区| 台湾省| 农安县| 临安市| 岳西县| 九寨沟县| 河东区| 根河市| 霍山县| 泾川县|