什么是代理模式?
由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
对代理模式的深入理解
举一个生活中的例子:
小明看上了隔壁村的小芳,但是呢,小明他不好意思直接去找小芳表达自己的心意,于是小明就托媒婆刘婶婶去找小芳来表达自己的心意。这里就有一个比较典型的代理模式:小芳和小明无法直接对接,小明只能找一个代理人来代理自己去找小芳。此时,小明是目标类,刘婶婶是代理类。(在程序中,对象A和对象B无法直接交互时)
当我们想买房子的时候,我们有时候不能直接接触卖家,我们都会去找第三方中介,中介帮我找到我们需要的房子,但是我们只需要额外付一点佣金即可。(在程序中,功能需要加强)
演员在拍电影时,可能某些动作他自己做不了而且对他来说过于危险,于是他就找了个替身演员来完成这个高难度动作,以免自己受伤。(程序中,目标需要被保护时)
代理模式的作用
为其他对象提供一种代理以控制对这个对象的访问,在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现简介引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不应该看到的内容和服务或者添加客户需要的额外服务。通过引入一个新的对象来实现对真实对象的操作或者将新的对象作为真实对象的一个替身,这种实现机制即为代理模式,通古果引入代理对象来间接访问一个对象,这就是代理模式的模式动机。
代理模式在java程序中的作用
作用一:当一个对象需要受到保护的时候,可以考虑使用代理对象去完成某个行为
作用二:需要给某个对象的功能进行功能增强的时候,可以考虑找一个代理进行增强。
作用三:A对象无法和B对象直接交互时,可以使用代理模式来解决。
代理模式中有三大角色:
- 代理类(代理主题)
- 目标类(真实主题)
- 代理类和目标类的公共接口(抽象主题):客户端在使用代理类时就像在使用目标类,不被客户端察觉,所以代理类和目标类要有共同的行为,也就是实现共同的接口。
代理模式在代码实现上,包括两种形式:
- 静态代理
- 动态代理
今天我们只说一下静态代理。
静态代理
我们通过程序来模拟一下我们网购订单的生成情况
业务接口类存在硬编码,当我们要计算订单生成耗时时,需要对业务接口类的每个业务方法都进行修改,这显然违背了OCP原则,同时代码的复用性较低。
我们使用代理类实现公共接口,然后我们再代理类的方法里面实现目标类的方法,并且进行功能增强。
那么静态代理的缺点是什么?
- 类爆炸,我们每个接口都需要对应的代理类,这样类会急剧膨胀,不好维护。
而动态代理就很好的解决了这个问题。