filled
Observer
One-to-many notification of state changes.
type Observer interface{ OnEvent(e Event) }
filled
Strategy
Select algorithm at runtime via interface.
type Sorter interface{ Sort([]int) []int }
filledChain of Responsibility
Pass the request along until one handler consumes it.
func Chain(hs ...Handler) Handler {
return func(r Request) Response {
for _, h := range hs {
if resp := h(r); resp.Handled { return resp }
}
return notFound
}
}
filledCommand
Encapsulate an action and its arguments as an object.
type Command func() error
queue := []Command{move, save, notify}
for _, c := range queue {
if err := c(); err != nil { rollback() }
}
filledIterator
Sequential access to elements of an aggregate.
func gen(ctx context.Context, xs []int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for _, v := range xs {
select { case out <- v: case <-ctx.Done(): return }
}
}()
return out
}
filledMediator
Centralize complex peer-to-peer communication.
type Bus struct{ peers map[string]chan Msg }
func (b *Bus) Send(to string, m Msg) { b.peers[to] <- m }
// peers don't know each other; only the bus
filledMemento
Capture and restore an object's state.
type Memento struct{ state []byte }
func (e *Editor) Snapshot() Memento { return Memento{state: clone(e.buf)} }
func (e *Editor) Restore(m Memento) { e.buf = m.state }
filledState
Object behavior changes with internal state.
type State interface{ Next(in Event) State }
func (m *Machine) Step(e Event) { m.state = m.state.Next(e) }
// each State implements its own transitions
filledTemplate Method
Skeleton in base, overridable steps in subtypes.
type Importer struct{ Hooks ImportHooks }
func (im *Importer) Run() {
im.Hooks.Open(); defer im.Hooks.Close()
for r := range im.Hooks.Read() { im.Hooks.Process(r) }
}
filledVisitor
External operation over an object hierarchy.
// Idiomatic Go: a type switch
switch x := node.(type) {
case *File: countFile(x)
case *Dir: countDir(x)
}
filledRegistry
Global lookup table for shared singletons.
var drivers = NewRegistry[Driver]()
func init(){ drivers.Register("postgres", &PgDriver{}) }
drv, ok := drivers.Get("postgres")