Sobes.tech
Junior — Middle

Ar galite apibūdinti savo patirtį taikant Chain of Responsibility modelį realiuose projektuose?

sobes.tech AI

Atsakymas iš AI

Viename iš mano projektų Go kalba aš panaudojau Chain of Responsibility modelį, kad apdorotų HTTP užklausas su skirtingais validacijos ir autorizacijos lygiais. Kiekvienas grandinės elementas tikrindavo tam tikrą sąlygą — pavyzdžiui, tokeno galiojimą, prieigos teises, duomenų formatą — ir arba apdorodavo užklausą, arba perduodavo ją kitam grandinės elementui. Tai leido lankstesnį naujų patikrinimų pridėjimą be esamo kodo keitimo ir pagerino skaitomumą.

Supaprastintas pavyzdys:

package main
import "fmt"

type Handler interface {
    SetNext(handler Handler)
    Handle(request string)
}

type BaseHandler struct {
    next Handler
}

func (b *BaseHandler) SetNext(handler Handler) {
    b.next = handler
}

func (b *BaseHandler) Handle(request string) {
    if b.next != nil {
        b.next.Handle(request)
    }
}

type AuthHandler struct { BaseHandler }

func (h *AuthHandler) Handle(request string) {
    if request == "valid_token" {
        fmt.Println("Auth passed")
        h.BaseHandler.Handle(request)
    } else {
        fmt.Println("Auth failed")
    }
}

func main() {
    auth := &AuthHandler{}
    auth.SetNext(&BaseHandler{})

    auth.Handle("valid_token")  // Auth passed
    auth.Handle("invalid")      // Auth failed
}

Šis požiūris padeda atskirti atsakomybę ir palengvina priežiūrą.