代理模式(Proxy Pattern)是一种结构型设计模式,它允许一个对象(代理)控制另一个对象的访问。代理模式通常涉及到创建一个包装对象(代理),以控制对原始对象的访问,从而提供额外的功能或控制访问方式。
考虑一个简单的图像加载的例子,其中包括一个接口 Image
和其实现类 RealImage
,以及一个代理类 ProxyImage
。
package main
import "fmt"
// Subject Interface
type Image interface {
Display()
}
// RealSubject
type RealImage struct {
filename string
}
func NewRealImage(filename string) *RealImage {
return &RealImage{filename: filename}
}
func (ri *RealImage) LoadFromDisk() {
fmt.Printf("Loading image: %s\n", ri.filename)
}
func (ri *RealImage) Display() {
ri.LoadFromDisk()
fmt.Printf("Displaying image: %s\n", ri.filename)
}
// Proxy
type ProxyImage struct {
realImage *RealImage
filename string
}
func NewProxyImage(filename string) *ProxyImage {
return &ProxyImage{filename: filename}
}
func (pi *ProxyImage) Display() {
if pi.realImage == nil {
pi.realImage = NewRealImage(pi.filename)
}
pi.realImage.Display()
}
// Client
func main() {
image := NewProxyImage("sample.jpg")
image.Display()
// The image is not loaded again because it's already cached in the proxy
image.Display()
}
在这个示例中,RealImage
是实际的图像类,而ProxyImage
是代理类。当客户端调用Display
方法时,ProxyImage
控制对真实对象的访问,确保图像被加载并显示。这种方式可以延迟图像的加载,提高系统性能。
我正在参与2024腾讯技术创作特训营第五期有奖征文,快来和我瓜分大奖!
声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。