Skip to content

Instantly share code, notes, and snippets.

@nasust
Created December 11, 2016 08:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nasust/a5c437c61a62b881da1233d49d5a7399 to your computer and use it in GitHub Desktop.
Save nasust/a5c437c61a62b881da1233d49d5a7399 to your computer and use it in GitHub Desktop.
Go言語のChain Of Responsibilityパターンの実装
package main
import "fmt"
const (
ERR = 3
NOTICE = 5
DEBUG = 7
)
type Logger interface {
WriteMessage(msg string)
}
type ChainLogger struct {
logger Logger
next *ChainLogger
mask int
}
func NewChainLogger(mask int, logger Logger) *ChainLogger {
return &ChainLogger{logger, nil, mask}
}
func (self *ChainLogger) SetNext(nextChainLogger *ChainLogger) *ChainLogger {
if self.next == nil {
self.next = nextChainLogger
} else {
self.next.SetNext(nextChainLogger)
}
return self
}
func (self *ChainLogger) Message(msg string, priority int) {
if priority <= self.mask {
self.logger.WriteMessage(msg)
if self.next != nil {
self.next.Message(msg, priority)
}
}
}
type StdoutLogger struct {
}
func (self *StdoutLogger) WriteMessage(msg string) {
fmt.Println("Writting to stdout: ", msg)
}
type EmailLogger struct {
}
func (self *EmailLogger) WriteMessage(msg string) {
fmt.Println("Sending via email :", msg)
}
type StderrLogger struct {
}
func (self *StderrLogger) WriteMessage(msg string) {
fmt.Println("Sending to stderr :", msg)
}
func main() {
l := NewChainLogger(DEBUG, &StdoutLogger{}).SetNext(
NewChainLogger(NOTICE, &EmailLogger{})).SetNext(
NewChainLogger(ERR, &StderrLogger{}))
l.Message("Entering function y.", DEBUG)
l.Message("Step1 Completed.", NOTICE)
l.Message("Ab error has occurred.", ERR)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment