go语言设计模式之proxy
代理模式,单元测试用例真的写得详细,
受教~
proxy.go
package proxy import ( //"errors" "fmt" ) type UserFinder interface { FindUser(id int32) (User, error) } type User struct { ID int32 } type UserList []User func (t *UserList) FindUser(id int32) (User, error) { for i := 0; i < len(*t); i++ { if (*t)[i].ID == id { return (*t)[i], nil } } return User{}, fmt.Errorf("User %d could not be found\n", id) } type UserListProxy struct { SomeDatabase UserList StackCache UserList StackCapacity int DidLastSearchUsedCache bool } func (u *UserListProxy) FindUser(id int32) (User, error) { user, err := u.StackCache.FindUser(id) if err == nil { fmt.Println("Returning user from cache") u.DidLastSearchUsedCache = true return user, nil } else { user, err = u.SomeDatabase.FindUser(id) if err != nil { return User{}, err } fmt.Println("Returning from database") u.addUserToStack(user) u.DidLastSearchUsedCache = false return user, nil } } func (t *UserList) addUser(newUser User) { *t = append(*t, newUser) } func (u *UserListProxy) addUserToStack(user User) { if len(u.StackCache) >= u.StackCapacity { u.StackCache = append(u.StackCache[1:], user) } else { u.StackCache.addUser(user) } }
proxy_test.go
package proxy import ( "fmt" "math/rand" "testing" ) func Test_UserListProxy(t *testing.T) { someDatabase := UserList{} rand.Seed(2342342) for i := 0; i < 1000; i++ { n := rand.Int31() fmt.Println(n) someDatabase = append(someDatabase, User{ID: n}) } proxy := UserListProxy{ SomeDatabase: someDatabase, StackCapacity: 2, StackCache: UserList{}, } knowsIDs := [3]int32{ someDatabase[3].ID, someDatabase[4].ID, someDatabase[5].ID} t.Run("FindUser - Empty cache", func(t *testing.T) { user, err := proxy.FindUser(knowsIDs[0]) if err != nil { t.Fatal(err) } if user.ID != knowsIDs[0] { t.Error("Returned user name doesn't match with expected") } if len(proxy.StackCache) != 1 { t.Error("After one successful search in an empty cache, the size of it must be one") } if proxy.DidLastSearchUsedCache { t.Error("No user can be returned from an empty cache") } }) t.Run("FindUser - One user, ask for the same user", func(t *testing.T) { user, err := proxy.FindUser(knowsIDs[0]) if err != nil { t.Fatal(err) } if user.ID != knowsIDs[0] { t.Error("Returned user name doesn't match with expected") } if len(proxy.StackCache) != 1 { t.Error("Cache must not grow if we asked for an object that stored on it") } if !proxy.DidLastSearchUsedCache { t.Error("The user should have been returned from the cache") } }) user1, err := proxy.FindUser(knowsIDs[0]) if err != nil { t.Fatal(err) } user2, _ := proxy.FindUser(knowsIDs[1]) if proxy.DidLastSearchUsedCache { t.Error("The user wasn't stored on the proxy cache yet") } user3, _ := proxy.FindUser(knowsIDs[2]) if proxy.DidLastSearchUsedCache { t.Error("The user wasn't stored on the proxy cache yet") } for i := 0; i < len(proxy.StackCache); i++ { if proxy.StackCache[i].ID == user1.ID { t.Error("User that should be gone was found") } } if len(proxy.StackCache) != 2 { t.Error("After inserting 3 users the cache should no grow" + " more than to two") } for _, v := range proxy.StackCache { if v != user2 && v != user3 { t.Error("A non expected user was found on the cache") } } }
go语言设计模式之proxy的更多相关文章
- java设计模式之Proxy(代理模式)
java设计模式之Proxy(代理模式) 2008-03-25 20:30 227人阅读 评论(0) 收藏 举报 设计模式javaauthorizationpermissionsstringclass ...
- 设计模式之Proxy(代理)
设计模式之Proxy(代理) 板桥里人banq http://www.jdon.com 2002/04/21/ 理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水, ...
- Go语言设计模式之函数式选项模式
Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...
- Go语言设计模式汇总
目录 设计模式背景和起源 设计模式是什么 Go语言模式分类 个人观点 Go语言从面世就受到了业界的普遍关注,随着区块链的火热Go语言的地位也急速蹿升,为了让读者对设计模式在Go语言中有一个初步的了解和 ...
- C语言设计模式
一 .C语言和设计模式(继承.封装.多态) C++有三个最重要的特点,即继承.封装.多态.我发现其实C语言也是可以面向对象的,也是可以应用设计模式的,关键就在于如何实现面向对象语言的三个重要属性. ( ...
- 设计模式--代理(Proxy)模式
在公司,经常性听到采购部的人说采购某样东材料,采购不了,需要通过代理商才可以.以前Insus.NET也做有一个练习<找人办事,代理设计模式(Proxy)>http://www.cnblog ...
- php设计模式之Proxy(代理模式)和Facade(外观)设计模式
Proxy(代理模式)和Facade(外观)设计模式它们均为更复杂的功能提供抽象化的概念,但这两种实现抽象化的过程大不相同 Proxy案例中,所有的方法和成员变量都来自于目标对象,必要时,该代理能够对 ...
- [学习笔记]设计模式之Proxy
为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 “魔镜啊魔镜,谁是这个世界上最美丽的人?” 每到晚上,女王都会问魔镜相同的问题(见Decorator模式).这是她还曾身为女巫时留下的 ...
- C语言设计模式-封装-继承-多态
快过年了,手头的工作慢慢也就少了,所以,研究技术的时间就多了很多时间,前些天在CSDN一博客看到有大牛在讨论C的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...
随机推荐
- C语言笔记 03_常量&存储类
常量 常量是固定值,在程序执行期间不会改变.这些固定的值,又叫做字面量. 常量可以是任何的基本数据类型,比如整数常量.浮点常量.字符常量,或字符串字面值,也有枚举常量. 整数常量 整数常量可以是十进制 ...
- Go学习笔记(持续更中,参考go编程基础,go边看边练)
使用关键字 var 定义变量,自动初始化为零值.如果提供初始化值,可省略变量类型. 在函数内部,可用更简略的 := 方式定义变量.空白符号_ package main import "fmt ...
- Python中的测试工具
当我们在写程序的时候,我们需要通过测试来验证程序是否出错或者存在问题,但是,编写大量的测试来确保程序的每个细节都没问题会显得很繁琐.在Python中,我们可以借助一些标准模块来帮助我们自动完成测试 ...
- LinuxProbe小结
1.修改主机名: /etc/hostname 2.配置 yum 软件仓库: (1)进入到 /etc/yum.repos.d/目录下,创建一个linuxprobe.repo的新文件(文件名称任意,结尾必 ...
- MyBatis操作Oracle批量插入 ORA-00933: SQL 命令未正确结束
最近在使用MyBatis操作Oracle数据库的时候,进行批量插入数据,思路是封装一个List集合通过Myabtis 的foreach标签进行循环插入,可是搬照Mysql的批量插入会产生 异常 ### ...
- CSS 利用 `padding-bottom` 实现固定比例的容器
复用 padding-bottom 可实现一块区域在窗口尺寸变化使始终保持自适应.对于响应式布局中的图片或视频来说比较有用. <div style="width: 100%; posi ...
- C#中类的实例化过程
创建某个类型的第一个实例时,所进行的操作顺序为:1.静态变量设置为02.执行静态变量初始化器3.执行基类的静态构造函数4.执行静态构造函数5.实例变量设置为06.执行衯变量初始化器7.执行基类中合适的 ...
- pycharm查看函数用法,参数信息的设置方法
在编写python程序时,常常会遇到一些不太常见的函数,有时候又不想去百度,那么,使用pycharm设置快速显示函数的参数和用法,这个方法十分快捷方便. step1. file -> setti ...
- 《Vue笔记01: 我与唐金州二三事》
最近我在收看唐金州在极客时间发布的<vue从入门到精通>,颇有收获. 唐金州,一点资讯前端技术专家,曾在蚂蚁金服就职,也是开源组件库ant design vue的作者,虽然唐老师写的ant ...
- JS 测试 Prototype
JS 测试 Prototype 测试 JavaScript 框架库 - Prototype 引用 Prototype 如需测试 JavaScript 库,您需要在网页中引用它. 为了引用某个库,请使用 ...