Go 实现代理模式

28 min read

代理模式是一种常见的设计模式,它通常用于控制对对象的访问。在代理模式中,一个对象(代理)充当另一个对象的接口,以控制对另一个对象的访问。

在 Go 中,可以使用接口来实现代理模式。下面是一个简单的例子:

package main

import "fmt"

// 接口
type Subject interface {
    Do() string
}

// 实现接口的实际对象
type RealSubject struct{}

func (s *RealSubject) Do() string {
    return "RealSubject doing something"
}

// 代理对象
type Proxy struct {
    realSubject *RealSubject
}

func (p *Proxy) Do() string {
    // 在这里可以进行控制访问实际对象的操作
    if p.realSubject == nil {
        p.realSubject = &RealSubject{}
    }
    return p.realSubject.Do()
}

func main() {
    // 创建代理对象
    proxy := &Proxy{}
    // 调用代理对象的方法,实际上会调用实际对象的方法
    result := proxy.Do()
    fmt.Println(result)
}

在这个例子中,我们定义了一个 Subject 接口,包含一个 Do 方法。接着,我们实现了这个接口的实际对象 RealSubject,并实现了 Do 方法。

最后,我们定义了一个 Proxy 代理对象,包含一个 realSubject 属性,它是实际对象的指针。Proxy 实现了 Subject 接口,并在 Do 方法中控制访问实际对象。如果实际对象不存在,将创建一个新的实际对象。

main 函数中,我们创建了代理对象 proxy 并调用了其 Do 方法。由于 proxy 实现了 Subject 接口,可以被当作实际对象来使用。当调用 Do 方法时,实际上会调用代理对象的 Do 方法,然后再调用实际对象的 Do 方法。最终结果是,代理对象控制了访问实际对象,确保了访问的安全性。