修饰器

修饰器模式就是在不改变对象内部结构的情况下,动态扩展它的功能。

Example_one

type Object func(string) stringfunc Decorate(fn Object) Object {return func(base string) string {ret := fn(base)ret = ret + " and Tshirt"return ret}
}func Dressing(cloth string) string {return "dressing " + cloth
}func main() {f := Decorate(Dressing)fmt.Println(f("shoes"))
}
> dressing shoes and Tshirt

Example_two

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)}
}// 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 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.0for k := 0; k <= n; k++ {result += <-ch}return result
}func main() {fw_pi := wrapcache(Pi, &sync.Map{})f_pi := wraplogger(fw_pi, log.New(os.Stdout, "test", 1))f_pi(10000)f_pi(10000)
}> test2020/05/28 took=157.4587ms, n=10000, result=3.141692643590535
> test2020/05/28 took=0s, n=10000, result=3.141692643590535

Go 语言实现 23 种设计模式(修饰器)相关推荐

  1. Go 语言实现 23 种设计模式 单例模式

    Go 语言实现 23 种设计模式 单例模式 单例模式 单例模式是一种常用的软件设计模式,在使用过程中,单例对象的类只有一个实例.使用单例模式,1 可以节省内存等资源,例如windows操作系统的资源管 ...

  2. Go 语言实现 23 种设计模式适配器

    Go 语言实现 23 种设计模式适配器 将一个类型的接口转换成客户希望的另外一个接口,使原本由于接口不兼容而不能一起工作的类可以一起工作. Example_one package mainimport ...

  3. java外围设计_Java 编程(23 种设计模式)

    简介 在一般的程序开发过程中,初中级程序员接触的程序设计模式是比较少的.最常见的可能就是单例模式.工厂模式.抽象工厂模式等等,但实际上程序中的设计模式是非常多的,具体可以分为 23 种设计模式.设计模 ...

  4. JAVA开发的23种设计模式之 —  装饰器模式 代理器模式

    装饰器模式 概述 : 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更加灵活 维基百科解释 : 通过使用修饰模式,可以在运行时扩充一个类的功能.原理是 :增加一个修饰类包裹 ...

  5. 快来,这里有23种设计模式的Go语言实现

    摘要:设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代码更容易被他人理解并且保证代码可靠性. 本文分享自华 ...

  6. 从追MM谈23种设计模式

    从追MM谈Java的23种设计模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说&quo ...

  7. 23种设计模式之模板方法

    23种设计模式总篇:chenmingyu.top/design/ 模板方法 模板方法属于行为型模式 定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定 ...

  8. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  9. java 23种设计模式详解

    1. 软件设计模式意义 文章链接:http://c.biancheng.net/design_pattern/     设计模式的本质是对面向对象设计原则运用,是对类的封装.继承和多态以及类的关联关系 ...

最新文章

  1. UpSetR 关联的 venneuler 包安装笔记
  2. 调python返回图片_三个好习惯,帮你写好Python里的异常处理
  3. 在cli命令行上显示当前数据库,以及查询表的行头信息
  4. 力扣209,长度最小的子数组(滑动窗口,JavaScript)
  5. python比flask更好的框架_(入门篇)Python框架之FastAPI——一个比Flask和Tornado更高性能的API 框架...
  6. 4款基于Django框架的开源软件推荐
  7. python的requests库入门必看
  8. linux环境c语言实现who,Linux下C语言编程环境的搭建1
  9. Tomcat乱码,Tomcat中文乱码解决方案
  10. react报错:Uncaught Error: Element type is invalid: expected a string (for built-in components) or a ..
  11. android 自动运行 app,「定时启动」时间一到自动运行指定的 App(Android)
  12. 【CS基础】计组计网
  13. 万字拆解江小白:新品牌做白酒,敢问路在何方?
  14. QT学习日记17——Qt数据库
  15. 云服务器安装MYSQL
  16. 【uView】picker 地区选择
  17. camx框架-Camera初始化
  18. matlab ar谱分析,AR模型功率谱估计的典型算法比较及MATLAB实现
  19. 浏览器小知识之谷歌(Google Chrome)浏览器
  20. 随笔 | 写在七月末的这一天

热门文章

  1. 网页变成灰色,对重大事件表示哀悼
  2. Animate.css介绍
  3. python绘制帕累托图
  4. Error0---local variable S is accessed from within inner class; needs to be declared final
  5. SharePoint 2013 开发——其他社交功能
  6. 检查MySQL主从数据一致性
  7. Android转载一:Android文件命名规范
  8. EASYUI+MVC4通用权限管理平台
  9. 一段个性化stringgrid的代码
  10. 哈哈,这个小游戏很有意思!