Go 语言实现 23 种设计模式(修饰器)
修饰器
修饰器模式就是在不改变对象内部结构的情况下,动态扩展它的功能。
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 种设计模式(修饰器)相关推荐
- Go 语言实现 23 种设计模式 单例模式
Go 语言实现 23 种设计模式 单例模式 单例模式 单例模式是一种常用的软件设计模式,在使用过程中,单例对象的类只有一个实例.使用单例模式,1 可以节省内存等资源,例如windows操作系统的资源管 ...
- Go 语言实现 23 种设计模式适配器
Go 语言实现 23 种设计模式适配器 将一个类型的接口转换成客户希望的另外一个接口,使原本由于接口不兼容而不能一起工作的类可以一起工作. Example_one package mainimport ...
- java外围设计_Java 编程(23 种设计模式)
简介 在一般的程序开发过程中,初中级程序员接触的程序设计模式是比较少的.最常见的可能就是单例模式.工厂模式.抽象工厂模式等等,但实际上程序中的设计模式是非常多的,具体可以分为 23 种设计模式.设计模 ...
- JAVA开发的23种设计模式之 — 装饰器模式 代理器模式
装饰器模式 概述 : 动态的给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更加灵活 维基百科解释 : 通过使用修饰模式,可以在运行时扩充一个类的功能.原理是 :增加一个修饰类包裹 ...
- 快来,这里有23种设计模式的Go语言实现
摘要:设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结,使用设计模式是为了可重用代码.让代码更容易被他人理解并且保证代码可靠性. 本文分享自华 ...
- 从追MM谈23种设计模式
从追MM谈Java的23种设计模式 1.FACTORY-追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说&quo ...
- 23种设计模式之模板方法
23种设计模式总篇:chenmingyu.top/design/ 模板方法 模板方法属于行为型模式 定义:定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的结构即可重定 ...
- 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)
本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...
- java 23种设计模式详解
1. 软件设计模式意义 文章链接:http://c.biancheng.net/design_pattern/ 设计模式的本质是对面向对象设计原则运用,是对类的封装.继承和多态以及类的关联关系 ...
最新文章
- UpSetR 关联的 venneuler 包安装笔记
- 调python返回图片_三个好习惯,帮你写好Python里的异常处理
- 在cli命令行上显示当前数据库,以及查询表的行头信息
- 力扣209,长度最小的子数组(滑动窗口,JavaScript)
- python比flask更好的框架_(入门篇)Python框架之FastAPI——一个比Flask和Tornado更高性能的API 框架...
- 4款基于Django框架的开源软件推荐
- python的requests库入门必看
- linux环境c语言实现who,Linux下C语言编程环境的搭建1
- Tomcat乱码,Tomcat中文乱码解决方案
- react报错:Uncaught Error: Element type is invalid: expected a string (for built-in components) or a ..
- android 自动运行 app,「定时启动」时间一到自动运行指定的 App(Android)
- 【CS基础】计组计网
- 万字拆解江小白:新品牌做白酒,敢问路在何方?
- QT学习日记17——Qt数据库
- 云服务器安装MYSQL
- 【uView】picker 地区选择
- camx框架-Camera初始化
- matlab ar谱分析,AR模型功率谱估计的典型算法比较及MATLAB实现
- 浏览器小知识之谷歌(Google Chrome)浏览器
- 随笔 | 写在七月末的这一天