gpt4 book ai didi

go - 责任链-当前失败时如何调用特定处理程序

转载 作者:IT王子 更新时间:2023-10-29 02:00:51 26 4
gpt4 key购买 nike

我要使用 Chain of responsibility pattern对于简单的 CLI 对话框:

type Handler interface {
Request(flag bool)
}

type AskName struct {
next Handler
}

func (h *AskName) Request(flag bool) {
fmt.Println("AskName.Request()")
if flag {
h.next.Request(flag)
}
}

type AskAge struct {
next Handler
}

func (h *AskAge) Request(flag bool) {
fmt.Println("AskAge.Request()")
if flag {
h.next.Request(flag)
}
}

type AskEmail struct {
next Handler
}

func (h *AskEmail) Request(flag bool) {
fmt.Println("AskEmail.Request()")
}

func main() {
handlerA := &AskName{&AskAge{new(AskEmail)}}
handlerA.Request(true)
}

问题:想象一下用户输入无效电子邮件的情况。如何重新调用 AskEmail 处理程序(或调用其他处理程序)?

例如,如果我这样拆分逻辑:

type AskEmail struct {
next Handler
}

func (h *AskEmail) Request(flag bool) {
fmt.Println("AskEmail.Request()")
if flag {
h.next.Request(flag)
}
}

type ValidateEmail struct {
next Handler
}

func (h *ValidateEmail) Request(flag bool) {
fmt.Println("ValidateEmail.Request()")
}

如果 ValidateEmail 失败,我如何从 ValidateEmail 调用 AskEmail

最佳答案

我认为你可以做到这一点

type AskEmail struct {
next Handler
}

func (h *AskEmail) Request(flag bool) {
fmt.Println("AskEmail.Request()")
if flag {
h.next.Request(flag)
}
}

type ValidateEmail struct {
next Handler
prev Handler
}

func (h *ValidateEmail) Request(flag bool) {
fmt.Println("ValidateEmail.Request()")
if !valid {
h.prev.Request(flag)
}
}

askEmail := &AskEmail{}
validateEmail := &ValidateEmail{prev: askEmail}
askEmail.next = validateEmail

关于go - 责任链-当前失败时如何调用特定处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55339431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com