静态代理技术

静态代理技术

在讲解静态代理之前,我们先看一下代理模式的概念。最初是在设计模式课程中学习过代理模式,当时也是一知半解,但是最近再看spring中,遇到一些设计模式中的设计思想,所以这里再进行重新学习一下。

## 代理模式

代理模式在我们的程序中是常用的设计模式之一。

我们先看一下代理模式的定义:代理模式主要是为其他对象提供一种代理以控制对这个对象的访问。当我们直接访问一个对象不能完成或者是不方便直接访问一个对象时,我们可以通过一个代理对象来进行间接的访问,所访问的真实对象与代理对象需要访问相同的接口。总的来说,代理对象主要是用来增强目标对象的功能的,目标对象是我们需要进行增强的对象。

代理模式又有很多的类型,如果我们按照代理模式创建的时期来进行划分的话,可以划分为静态代理和动态代理,这里代理对象创建的时期指的是,一个对象的增强版的代理对象是提前创建好的还是需要增强的时候再创建,当然或者动态代理具有很强的灵活性。

简单的说,举一个生活中的例子,比如代理律师,就相当于代理模式中的代理对象。在遇到法律问题的时候,委托方在一个问题上可能不是那么的专业,这个时候就需要一个代理代表委托方去处理一些问题,那么就可以说这个律师就是对委托方的增强,实现一些委托方不能做到或者是不方便做到的事情。

那么进一步的说,如果一个律师随时可以被多个有需求的委托方代理,那么这就是动态代理,在需要的时候创建,如果一个律师是一个企业中的执业律师,那么这个律师证只为这一个企业服务,可以说这样的形式就是静态代理。

下面详细讲解一下静态代理

静态代理技术

实现一个静态代理,只需要三步就可以完成,首先我们需要定义一个业务接口,然后定义业务接口的实现类,然后定义代理类实现业务接口并增强功能,最后写一个client去调用。

首先定义一个业务接口:

接口中定义两种方法,更新和查询方法

``` java

1
2
3
4
public interface UserInfo {    
public void update();//更新信息
public void query();//查询信息
}

```

我们写一个实现类,实现这个接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.proxyMoShi.staticProxy;

public class UserInfoImpl implements UserInfo {

@Override
public void update() {
System.out.println("这是更新操作");
}

@Override
public void query() {
System.out.println("这是查询的方法");
}
}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

下面我们写一个代理类去增强这个对象、

```java
package com.proxyMoShi.staticProxy;

public class UserStaticProxy implements UserInfo {
private UserInfoImpl userInfo;

public UserStaticProxy(UserInfoImpl userInfoimple) {
this.userInfo = userInfoimple;
}

@Override
public void update() {
System.out.println("在更新之前进行一系列的日志操作");
userInfo.update();
System.out.println("在更新之后进行一系列的日志操作");
}

@Override
public void query() {
System.out.println("在查询之前进行一系列的操作");
userInfo.query();
System.out.println("在查询之后进行一系列的操作");
}
}

使用这个对象之后,我们就可以在执行原来对象之前或者是之后,加上执行一些方法,比如日志功能,或者是权限判断等一些操作,这样我们可以在不改变原来类的前提下对功能进行扩展。

下面我们写一个client去执行以下我们写的代理类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.proxyMoShi.staticProxy;

public class clientStaticProxy {
public static void main(String[] args) {
/*UserInfo userInfo = new UserInfoImpl();
userInfo.query();
userInfo.update();*/

UserInfoImpl userInfo = new UserInfoImpl();
UserStaticProxy userStaticProxy = new UserStaticProxy(userInfo);

userStaticProxy.query();
userStaticProxy.update();

}
}

执行结果:

1573560149341

那么上面就是静态代理的实现过程,我们不改变原来的实现类,而且实现了一些方法。

但是我们可能也发现了,在静态代理中,一个代理类只能为一个接口实现服务,如果我们要是有很多都需要代理呢?那么就需要为每一个需要代理的接口,写一个代理类,这个时候每个代理实现的功能都是相同的功能,代码存在大量的重复。那么这个时候就需要创建动态代理,动态代理与静态代理相比具有更高的灵活性。

本文标题:静态代理技术

文章作者:雷凯博

发布时间:2019年11月10日 - 19:11

最后更新:2021年05月16日 - 19:05

原始链接:http://yoursite.com/2019/11/10/2019-07-10-%E9%9D%99%E6%80%81%E4%BB%A3%E7%90%86%E6%8A%80%E6%9C%AF/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------
0%