Hello World - 设计模式
type: channel
link: https://blog.jerichos.site/index.php/tag/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/
items: Golang Design Patterns

Golang Design Patterns
type: item
date: 2023-03-05T16:38:00+08:00
description: {collapse}{collapse-item label="Decorator Pattern" open} 1.定义装饰器模式是一种结构型设计模式,允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。2.应用这是一个计算Π的函数func Pi(n int) float64 { ch := make(chan float64) for k := 0; k <= n; k++ { go func(ch chan float64, k float64) { ch <- 4 * math.Pow(-1, k) / (2*k + 1) }(ch, float64(k)) } result := 0.0 for k := 0; k <= n; k++ { result += <-ch } return result }现在如果需要在这个求Π的程序上增加一个功能,计算出求Π耗费的时间并将结果通过log对象打印出来,可以封装一个函数来增加这个功能，而不去破坏原来函数的结构type piFunc func(int) float64 // logger(cache(Pi(n))) func wraplogger(fun piFunc, logger *log.Logger) piFunc { return func(n int) float64 { fn := func(n int) (result float64) { defer func(t time.Time) { logger.Printf("took=%v, n=%v, result=%v", time.Since(t), n, result) }(time.Now()) return fun(n) } return fn(n) } }写一个测试例子看下效果func main() { g := wraplogger(pi, log.New(os.Stdout, "Test ", 1)) g(100000) g(20000) }如果现在需要再增加一个缓存的功能,计算过的结果存起来,继续封装一个函数扩充pi的功能// cache(logger(Pi(n))) func wrapcache(fun piFunc, cache *sync.Map) piFunc { return func(n int) float64 { fn := func(n int) float64 { key := fmt.Sprintf("n=%d", n) val, ok := cache.Load(key) if ok { return val.(float64) } result := fun(n) cache.Store(key, result) return result } return fn(n) } }写个测试例子测试下func main() { f := wrapcache(Pi, &sync.Map{}) g := wraplogger(f, log.New(os.Stdout, "Test ", 1)) g(100000) g(20000) g(100000) }如果现在不需要计算Π，而是对整数取半操作同时增加缓存,这个时候只需将wrapcache函数参数求Π函数换成取半函数即可func divide(n int) float64 { return float64(n / 2) } func main() { f := wrapcache(divide, &sync.Map{}) g := wraplogger(f, log.New(os.Stdout, "Divide ", 1)) g(10000) g(2000) g(10) g(10000) }3.优缺点优点缺点无需创建新子类即可扩展对象的行为在封装器栈中删除特定封装器比较困难可以在运行时添加或删除对象的功能实现行为不受装饰栈顺序影响的装饰比较困难可以用多个装饰封装对象来组合几种行为各层的初始化配置代码看上去可能会很糟糕单一职责原则,可以将实现了许多不同行为的一个大类拆分为多个较小的类 {/collapse-item}{collapse-item label="Generator And Observer Pattern" open}1.定义生成器模式是一种创建型设计模式,使你能够分步骤创建复杂对象.该模式允许你使用相同的创建代码生成不同类型和形式的对象观察者模式是一种行为设计模式,允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象2.应用生成器模式生成0-n的斐波那契数列package main import "fmt" func fib(n int) chan int { out :…