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的设计模式,正好看到了,我也有兴趣转发,修改,研究一下. 记得读大学的时候,老师就告诉我们 ...
随机推荐
- python接口测试中常见的两种接口依赖处理方式
一.请求体的字段依赖 这种情况多数是在当前测试的接口,它的前置接口的请求体中的字段要拿来在当前的接口请求体中继续使用,比如修改用户信息的接口,该接口会使用到用户名的字段,该字段是由创建用户时的请求体中 ...
- Java方法之重载
Java方法之重载 本篇探究Java中的方法重载.那么,什么是重载呢?先上一串代码: package com.my.pac06; /** * @author Summerday * @date 201 ...
- netcore 2.2 使用 Autofac 实现自动注入
Autofac自动注入是通过名称约定来实现依赖注入 ps:本demo接口层都以“I”开头,以“Service”结尾.服务层实现都以“Service”结尾. 为什么要实现自动注入 大多时候,我们都是 以 ...
- 在centos上安装mysql
本文依然是用的xftp上传gz文件,然后在xShell上操作的,如果没有安装使用这两个文件的请查阅之前的博客. 1.将下载好的文件用xftp上传到对应的位置. 2.解压文件:tar -zvxf m ...
- 工厂模式-C#改良实现
参考了下网上的工厂模式实现,总的来说例子还是OK得,但是示例太单一了,因此我做了下优化的改良实现. namespace DP { public interface ICreditCard { stri ...
- Socket的常用方法。
构造方法: 1.使用构造方法 public ServerSocket(int port) 和public ServerSocket(int port,int backlog) 创建ServerSock ...
- SSM + VUE 实现简单的 CRUD
一.项目分析 1.需求 (1)使用 ssm + vue 实现一个crud(数据库增删改查)的简单实现.(2)前后端分离,前端页面展示+后台管理. 2.技术点 (1)基础框架: SSM(Spring,S ...
- HAProxy实现网站高并发集群
简介:HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会 ...
- Java基础 - volatile
volatile的作用:对与volatile修饰的变量, 1,保证该变量对所有线程的可见性. 2,禁止指令重排序. Java内存模型(JMM) 原子性 i = 2; 把i加载到工作内存副本i,副本i= ...
- [译]Vulkan教程(28)Image视图和采样器
[译]Vulkan教程(28)Image视图和采样器 Image view and sampler - Image视图和采样器 In this chapter we're going to creat ...