代理模式(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

results matching ""

    No results matching ""