设计模式之代理模式

miloyang
0 评论
/ /
508 阅读
/
1509 字
23 2023-11

简介

代理模式(Proxy Pattern)是一种结构型设计模式,它充当其他对象的接口,以控制对这个对象的访问。代理模式主要用于在访问一个对象时引入一定程度的间接性,以便实现某些控制或附加功能。

在代理模式中,通常会涉及到以下几个角色:

  • Subject(主题接口)

    定义了真实主题和代理类共同实现的接口。

  • RealSubject(真实主题)

    定义了真正实现主题接口的类,是被代理的对象。

  • Proxy(代理类)

    实现了主题接口,其中包含对真实主题的引用,以便在需要时代理真实主题。

jugelizi

你要买车,你又没忙,找了一个中间商代理,就是中介帮你去买车,你给他买车钱、代理费,他给你车。

Demo

// Subject 主题接口,要买车
type Subject interface {
    buyCar(name string, price int)
}

// Boss 真实主题,老板要买车
type Boss struct {
}

func (b Boss) buyCar(name string, price int) {
    fmt.Printf("委托中介买车,车品牌是%s,价格是%d,中介费是%d", name, price, price/2)
}

// Agent 代理商
type Agent struct {
    boss Boss // 他代表老板
}

// 代理去买车
func (a *Agent) buyCar(name string, price int) {
    a.boss.buyCar(name, price) // 买完车通知老板
}

这个例子中,subject是主题接口,定义了老板和代理商共同的事情,就是买车的接口,Boss是真实的主题,实现了买车的接口,表示真正处理请求的对象。Agent是代理商,也实现了buycar的接口,但是买完车后需要通知老板,所以包含对真实主题的引用。

作用和场景

  • 控制对对象的访问

    代理模式可以用于控制对某个对象的访问,例如在访问某个敏感对象或资源时进行授权、验证等。

  • 附加功能

    代理模式可以在不修改真实主题的情况下,为其附加一些额外的功能,例如记录日志、性能监测、缓存等。

  • 延迟加载

    代理模式可以实现延迟加载,即在真正需要使用真实主题时再进行实例化和初始化。

  • 远程代理

    代理模式可以在客户端和服务端之间引入代理,实现远程方法调用。

总体而言,代理模式适用于需要控制对对象访问、附加功能、延迟加载等场景。通过引入代理,可以在不改变原有代码的情况下,实现对对象访问的控制和附加功能的扩展。

人未眠
工作数十年
脚步未曾歇,学习未曾停
乍回首
路程虽丰富,知识未记录
   借此博客,与之共进步