Last active
December 15, 2023 09:01
-
-
Save Guaderxx/d27e0b13ad7c2cfa62d84a7dcc1f9851 to your computer and use it in GitHub Desktop.
chain of responsibility
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package main | |
import "fmt" | |
type Request struct { | |
amount int | |
} | |
type Handler interface { | |
SetNext(handler Handler) Handler | |
Handle(request *Request) bool | |
} | |
type CreditCardHandler struct { | |
next Handler | |
} | |
func (cc *CreditCardHandler) SetNext(handler Handler) Handler { | |
cc.next = handler | |
return handler | |
} | |
func (cc *CreditCardHandler) Handle(request *Request) bool { | |
if request.amount > 5000 && request.amount < 10000 { | |
fmt.Println("credit card handler processed the request") | |
return true | |
} | |
if cc.next != nil { | |
return cc.next.Handle(request) | |
} | |
fmt.Println("no handler available in creditcard handler") | |
return false | |
} | |
type BankHandler struct { | |
next Handler | |
} | |
func (b *BankHandler) SetNext(handler Handler) Handler { | |
b.next = handler | |
return handler | |
} | |
func (b *BankHandler) Handle(req *Request) bool { | |
if req.amount < 1000 { | |
fmt.Println("bank handler processed the request") | |
return true | |
} | |
if b.next != nil { | |
return b.next.Handle(req) | |
} | |
return false | |
} | |
type LoanHandler struct { | |
next Handler | |
} | |
func (l *LoanHandler) SetNext(handler Handler) Handler { | |
l.next = handler | |
return handler | |
} | |
func (l *LoanHandler) Handle(req *Request) bool { | |
if req.amount >= 10000 { | |
fmt.Println("loan handler processed the request") | |
return true | |
} | |
if l.next != nil { | |
return l.next.Handle(req) | |
} | |
fmt.Println("no handler available in loan handler") | |
return false | |
} | |
func main() { | |
bank := &BankHandler{} | |
cc := &CreditCardHandler{} | |
loan := &LoanHandler{} | |
bank.SetNext(cc).SetNext(loan) | |
if !bank.Handle(&Request{amount: 12000}) { | |
fmt.Println("All handlers are busy") | |
} | |
} | |
// output: loan handler processed the request |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment