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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

紫书的训练计划——一点点来,坚持到底!

先做 第10章3 数论的一点补充。然后趁热温习 10.1 和10.2 &#xff08;可能会有重的题目&#xff09; &#xff08;期望&#xff0c;概率的题目还要过段时间回来补坑&#xff09;然后 第7、8.1&#xff0c;8.2 章做暴力求解和高效算法&#xff08;可以适当的加快步伐&#…

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

Go 语言实现 23 种设计模式 单例模式 单例模式 单例模式是一种常用的软件设计模式&#xff0c;在使用过程中&#xff0c;单例对象的类只有一个实例。使用单例模式&#xff0c;1 可以节省内存等资源&#xff0c;例如windows操作系统的资源管理器只有一个就够了。2 方便配置管理…

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

Go 语言实现 23 种设计模式适配器 将一个类型的接口转换成客户希望的另外一个接口&#xff0c;使原本由于接口不兼容而不能一起工作的类可以一起工作。 Example_one package mainimport "fmt"// Adaptee 适配者 type MyLegacyPrinter struct{}func (l *MyLegacyPr…

go设计模式思维导图

go设计模式思维导图

uva 1610——Party Games

题目链接&#xff1a;http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id51171 题意&#xff1a;给你n个串的集合D&#xff0c;然后求一个长度最短的串s&#xff0c;使得使得s大于等于D中一半的串&#xff0c;又同时小于另一半串。 思路&#xff1a;直接暴力。先对…

链表相加 2. 两数相加

2. 两数相加 给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。 如果&#xff0c;我们将这两个数相加起来&#xff0c;则会返回一个新的链表来表示它们的和。 您可以…

uva10780 - Again Prime? No time

uva10780 - Again Prime? No timeAgain Prime? No time. The problem statement is very easy. Given a number n you have to determine the largest power of m, not necessarily prime, that divides n!. Input The input file consists of several test cases. The first…

303. 区域和检索 - 数组不可变

303. 区域和检索 - 数组不可变 给定一个整数数组 nums&#xff0c;求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和&#xff0c;包含 i, j 两点。 示例&#xff1a; 给定 nums [-2, 0, 3, -5, 2, -1]&#xff0c;求和函数为 sumRange() sumRange(0, 2) -> 1 sumRange…

【转载】最短路径之Dijkstra算法详细讲解

&#xff11; 最短路径算法 在日常生活中&#xff0c;我们如果需要常常往返A地区和B地区之间&#xff0c;我们最希望知道的可能是从A地区到B地区间的众多路径中&#xff0c;那一条路径的路途最短。最短路径问题是图论研究中的一个经典算法问题&#xff0c; 旨在寻找图&#xf…

Intelij 添加php注释

没有methodParameters()) groovyScript("def result; def params\"${_1}\".replaceAll([\\\\[|\\\\]|\\\\s], ).split(,).toList(); for(i 0; i < params.size(); i) {result * param params[i] ((i < params.size() - 1) ? \\n:)}; return result…

HDU 2544 最短路(各种最短路算法的实现)

链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid2544 题目&#xff1a; Problem Description 在每年的校赛里&#xff0c;所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候&#xff0c;却是非常累的…

为什么LeetCode过一段时间又不会了

怎么从这个迷宫的左上角走到右下角&#xff1f; 看起来好像很简单&#xff0c;花时间还是可以找得到答案。 看了答案之后可以很清楚&#xff0c;这是正解。 只有一个问题&#xff1a; 我怎么就没立刻想到&#xff1f; 当在看题解或者听别人讲授思路的时候&#xff0c;你就是…

148. 排序链表

148. 排序链表 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 示…

POJ 3660 Cow Contest(传递闭包floyed算法)

Description N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a certain constant skill rating that is unique among the competitors. The contest is…

23. 合并K个升序链表

23. 合并K个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xf…

HDU 1874 畅通工程续 (Dijkstra , Floyd , SPFA, Bellman_Ford 四种算法)

畅通工程续 题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1874 Problem Description 某省自从实行了很多年的畅通工程计划后&#xff0c;终于修建了很多路。不过路多了也不好&#xff0c;每次要从一个城镇到另一个城镇时&#xff0c;都有许多种道路方案可以…

训练指南——数学专题一的总结

差不多一个星期过去了&#xff0c;在这一个多星期里&#xff0c;我做了一个数学专题和两场训练赛&#xff0c;要说对自己的感觉&#xff0c;只能说很差劲&#xff0c;开始的时候以为环境会比现在宽松很多&#xff0c;后来才发现想法是错误的&#xff0c;实验室室里室一种紧张的…

micro/protoc-gen-micro 不见了

别挣扎了&#xff0c;这个项目被官方删了。换别的用吧 别挣扎了&#xff0c;这个项目被官方删了。换别的用吧 别挣扎了&#xff0c;这个项目被官方删了。换别的用吧 别挣扎了&#xff0c;这个项目被官方删了。换别的用吧

关于第二次训练赛

第二次训练赛甚至比第一次还要差&#xff0c;开始做的时候&#xff0c;因为在调并查集的题目&#xff0c;一时忘了比赛开始时间&#xff0c;这又导致了在开始便就输在了起跑线上&#xff0c;接下来看A&#xff0c;20分钟后想到了BFS&#xff0c;不过和p商量后&#xff0c;发现他…

一步获取LeetCode的cookies

登录LeetCode 获取登陆的cookies 浏览器F12。console输入 javascript:document.cookie 打完收工 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布 字数不够csdn不发布