代理模式

java的静态代理和动态代理

概述

代理模式是一种常见的设计模式,分为静态代理,动态代理。代理提供了一种让我们间接访问目标对象的方法,以便我们对目标对象实现基本的功能外,还可以增加一些额外的功能。

静态代理

代理类通过实现与目标类相同的接口,并在类中维护一个代理对象,通过构造方法传入目标对象,并赋值给代理对象。通过代理对象执行实现的接口方法,并实现增加功能的需求。

栗子:小明和小刚都待在宿舍,到了中午了,要去食堂吃饭,小明不想去,就叫小刚带饭,小刚答应了,带饭回来的时候捡到十块钱,于是小刚还帮小明多带了瓶饮料。小明吃完饭后,由于游戏开了,不想去丢饭盒,于是小刚又去帮他收拾。

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
28
29
//接口
public interface Lunch {

void eat();

}
//小明
public class XiaoMing implements Lunch{

@Override
public void eat() {
System.out.println("小明吃午饭");
}
}
//代理人小刚
public class ProxyXiaoGang implements Lunch{

//代理对象 通过构造方法传入实际对象,并赋值给它
private Lunch lunch;
public ProxyXiaoGang(Lunch lunch) {
this.lunch = lunch;
}
@Override
public void eat() {
System.out.println("我是带饭人小刚,帮小明带饭,顺便带了瓶饮料");
lunch.eat();
System.out.println("我是带饭人小刚,小明吃完了饭,我帮他收拾一下");
}
}

动态代理

由于静态代理每个代理类只能为一个接口服务,当接口过多时,会产生大量的的代理类,而动态代理可以解决这一点,它可以为一个类实现的所有接口服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
List<String> list = new ArrayList<>();

//param1:类加载器 param2:类实现的所有接口 param3:InvocationHander处理器
List<String> listProxy= (List<String>)Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new InvocationHandler() {
// proxy 代理对象的一个实例 method 当前要执行的方法 args:方法执行需要的参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

Object invoke = null;
//如果是add方法,则对它增强
if(method.getName().equals("add")) {
System.out.println("执行前");
invoke = method.invoke(list, args[0]);
System.out.println("执行后");
}
return method.invoke(list, args[0]);
}
});

listProxy.add("hello");
System.out.println(listProxy.get(0));

总结:静态代理一个代理类只能为一个接口提供服务

   动态代理一个代理类可以为该类实现的所有接口服务

文章目录
  1. 1. java的静态代理和动态代理
    1. 1.1. 概述
    2. 1.2. 静态代理
  2. 2. 动态代理
|
载入天数...载入时分秒...