代理模式(Proxy Design Pattern)
代理模式其实很好理解,像常用的 nginx、haproxy 等的反向代理服务器正是基于这一原理实现,代理服务器提供了对外的访问接口,内部则根据各种规则路由到不同的服务器上。
代理模式提供了一个对外提供功能的接口,而它内部的实现是由另外一个模块完成,还可以在执行前后增加一些处理任务。
Go语言中会大量的用到这一模式,比如像gin、echo等web框架中的中间件的实现的切面动作,可以在执行到我们代码逻辑的前后增加记录日志、安全校验等动作,由中间件决定是否要调用我们的代码。
代码示例
package proxy
import (
"fmt"
)
type User struct {
Name string
}
func (u User) Login() {
fmt.Printf("%s 正在登录\n", u.Name)
}
type Handler interface {
HandleFunc(pattern string, handler func())
}
type LoginHandler struct{}
func (l LoginHandler) HandleFunc(pattern string, fn func()) {
fmt.Printf("调用登录: %s\n", pattern)
fn()
fmt.Printf("完成登录: %s\n", pattern)
}
调用:
var loginHander LoginHandler
loginHander.HandleFunc("/user/login", func() {
user := &User{Name: "zhangsan"}
user.Login()
})
// Output:
// 调用登录: /user/login
// zhangsan 正在登录
// 完成登录: /user/login