设计模式-代理模式

本文介绍了代理模式在Go和Python中的应用,通过UML图展示如何通过ProxyImage减少RealImage内存占用。通过实例演示了如何实现远程代理、虚拟代理和防火墙代理,并强调了模式如何提升系统的扩展性和逻辑分离。
摘要由CSDN通过智能技术生成

设计模式-代理模式

在这里插入图片描述

参考


使用场景

  • 远程代理
  • 虚拟代理
  • 防火墙代理

Demo分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OgvgRqbD-1660555913239)(C:\Users\86136\AppData\Roaming\Typora\typora-user-images\image-20220815170924882.png)]

分析:

根据上述的UML图,我们将创建一个Image接口和实现Image接口的实体类。ProxyImage 可以减少RealImage对象的重复加载的内存占用。

Go实现

RealImage

type RealImage struct {
	fileName string
}

func (r *RealImage) LoadImage() {
	fmt.Printf("Loading image: %s\n", r.fileName)
}

func (rImage *RealImage) Display() {
	fmt.Printf("Displaying %s\n", rImage.fileName)
}

func initRealImage(fileName string) *RealImage {
	realImage := &RealImage{fileName}
	realImage.LoadImage()
	return realImage
}

ProxyImage


type ProxyImage struct {
	realImage *RealImage
	fileName  string
}

func (pImage *ProxyImage) Display() {
	if pImage.realImage == nil {
		pImage.realImage = &RealImage{fileName: pImage.fileName}
	}
	pImage.realImage.Display()
}

测试

func test() {
	image := initRealImage("test.jpg")
	// 要从磁盘加载
	image.Display()
	// 不需要从磁盘加载
	image.Display()
}

func main() {
	test()
}

输出

Loading image: test.jpg
Displaying test.jpg
Displaying test.jpg

python实现

class Image(object):
  """
    ## 图像的抽象类
  """
  def __init__(self, fileName):
    self.fileName = fileName
    pass
  def Display(self):
    pass

class RealImage(Image):
  def __init__(self, fileName):
    super().__init__(fileName)
    self.LoadImage()
  def LoadImage(self):
    print(f"Loading {self.fileName}")
  def Display(self):
    print(f"Displaying {self.fileName}")

class ProxyImage(Image):
  """
    ## 图像的代理类
  """
  def __init__(self, fileName):
    super().__init__(fileName)
    self.realImage = None
  def Display(self):
    if self.realImage is None:
      self.realImage = RealImage(self.fileName)
    self.realImage.Display()

def test():
  image = ProxyImage("test.jpg")
  image.Display()
  image.Display()

if __name__ == '__main__':
  test()

输出

Loading test.jpg
Displaying test.jpg
Displaying test.jpg

小结

总的来说代理模式,使用起来简单快捷。并且可以实现具体业务和通用逻辑的分离,这使得系统的可扩展性增强。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值