静态代理和动态代理

 

代理模式(静态代理)

代理模式是为其他对象提供一种代理以控制对这个对象的访问。

定义上也不算好理解, 上一个 《大话设计模式》 的图。

  1. 和被代理对象实现了同一个接口;
  2. 内部含有一个被代理对象的示例;

优点

  1. 真实对象可以专注于自己的业务逻辑控制;
  2. 非业务逻辑相关的部分, 可以通过代理类来处理;
  3. 隐藏了真实的对象, 对外只暴露代理对象。
  4. 扩展性:由于实现了相同的接口, 因此被代理对象的逻辑不管如何变化, 代理对象都不需要更改。

使用场合

  1. 控制对真实对象的访问;
  2. 实现日志记录;
  3. 统计对象的访问数量;
  4. 等等。

一些思考

在代理对象内部, 真实对象是什么时候被初始化的, 以及初始化的对象是由谁产生的?

在我看过的代码和书籍中, 有如下几种, 对此我也是很困惑, 以下是我的一些见解

不推荐

  1. 将真实对象在代理对象构造函数内部初始化出来。
public LandlordProxy() {     landlord = new LandlordImpl(); }
  1. 构造函数不做改变, 在使用方法时
public boolean rental() {     if(landlord==null){         landlord = new LandlordImpl();      }     if (numPersons < NUM_ALLOWED) {         System.out.println("今天李老板不接客了");     } else {         beforeRental();         numPersons++;         if (landlord.rental()) {             afterRental();         }     }      return false; }

以上两种的思想都是在代理对象内部对真实对象进行初始化, 我个人不是很赞同这种做法。

如果我们代理对象代理的不仅仅是李老板, 又代理了王老板, 那么怎么办?要写两个基本一模一样的代理类?

推荐做法

就是我们使用的, 在构造函数中传入

public LandlordProxy(Landlord landlord) {         this.landlord = landlord; }

将真实对象的初始化交给调用者来进行。

这样, 不管是什么老板, 他们可以自己管理自己的租房方法, 但是相同的工作由代理来做, 而只需要一个代理类。实现了代码的复用。

动态代理

如果是一两个方法需要进行代理, 我们使用静态代理那挺好。

但如果我们的接口中有 20 个方法, 每个方法都需要在前后加上前后的逻辑, 比如说记录一下日志。那么, 我们就一直需要做一些重复性的工作, 相同的代码需要写很多遍, 不单单是写的时候痛苦, 后面维护起来也很难受。

基于此, 动态代理诞生了。

在程序运行时运用反射机制动态创建代理类

在 Java 中, 实现动态代理很简单

定义一个实现InvocationHandler的类

如下所示

public class DynamicProxy implements InvocationHandler {      private Object target;      public 
                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信