代理模式(Proxy Design Patten)

定义
代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
静态代理
代理类实现和源类相同的接口,每个类单独实现一个代理类
缺点
- 需要在代理类中实现与原始类一致的所有接口,并且为每个接口添加相似的功能
- 如果我们需要添加的功能有多个,我们需要为每个功能添加一个代理类
动态代理
不事先编写号代理类的代码,而是在运行时动态加载需要代理的类
应用场景
- 业务系统非功能性需求开发
- RPC/缓存场景应用代理模式
- 监控、统计、鉴权、限流、事务、日志等
go源码实现
静态代理实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| package proxy
import ( "fmt" "time" )
type IUser interface { Login() error }
type User struct { }
func (u User) Login() error { fmt.Println("login") return nil }
func NewUserProxy() UserProxy { return UserProxy{ user: &User{}, } }
type UserProxy struct { user *User }
func (up UserProxy) Login() error { start := time.Now() if err := up.user.Login(); err != nil { return err }
fmt.Printf("user login cost time: %s", time.Now().Sub(start)) return nil }
|
go源码实现
// TODO