代理模式是一种常见的设计模式,它通常用于控制对对象的访问。在代理模式中,一个对象(代理)充当另一个对象的接口,以控制对另一个对象的访问。
在 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
方法。最终结果是,代理对象控制了访问实际对象,确保了访问的安全性。