代理模式
静态代理模式
1 package com.java.proxy;
2
3 /**
4 * 代理模式
5 *
6 */
7 public class ProxyTest {
8 public static void main(String[] args) {
9 CoalBossProxy cbp = new CoalBossProxy();
10 cbp.meet();
11 cbp.consume();
12
13 SteelBossProxy sbp = new SteelBossProxy();
14 sbp.meet();
15 sbp.consume();
16 }
17 }
18
19 interface Boss {
20
21 public void meet();
22
23 public void consume();
24
25 }
26
27 //被代理类
28 class CoalBoss implements Boss {
29
30 @Override
31 public void meet() {
32 System.out.println("与煤老板见面");
33 }
34
35 @Override
36 public void consume() {
37 System.out.println("让煤老板消费");
38 }
39
40 }
41
42 //代理类
43 class CoalBossProxy implements Boss {
44
45 private CoalBoss cb;
46
47 public CoalBossProxy() {
48 cb = new CoalBoss();
49 }
50
51 @Override
52 public void meet() {
53 System.out.println("-----------代理开始-----------");
54 cb.meet();
55 System.out.println("-----------代理结束-----------");
56 }
57
58 @Override
59 public void consume() {
60 System.out.println("-----------代理开始-----------");
61 cb.consume();
62 System.out.println("-----------代理结束-----------");
63 }
64
65 }
66
67 class SteelBoss implements Boss {
68
69 @Override
70 public void meet() {
71 System.out.println("与钢铁老板见面");
72 }
73
74 @Override
75 public void consume() {
76 System.out.println("让钢铁老板消费");
77 }
78
79 }
80
81 class SteelBossProxy implements Boss {
82
83 private SteelBoss sb;
84
85 public SteelBossProxy() {
86 sb = new SteelBoss();
87 }
88
89 @Override
90 public void meet() {
91 System.out.println("-----------代理开始-----------");
92 sb.meet();
93 System.out.println("-----------代理结束-----------");
94 }
95
96 @Override
97 public void consume() {
98 System.out.println("-----------代理开始-----------");
99 sb.consume();
100 System.out.println("-----------代理结束-----------");
101 }
102 }
动态代理模式
1 package com.java.proxy;
2
3 import java.lang.reflect.InvocationHandler;
4 import java.lang.reflect.Method;
5 import java.lang.reflect.Proxy;
6
7 /**
8 * 动态代理模式
9 * 动态代理:需要实现 java.lang.reflect.InvocationHandler; 接口
10 *
11 * public Object invoke(Object proxy, Method method, Object[] args)
12 *
13 * proxy : 传递的是动态生成的代理对象
14 * method : 需要执行方法的 Method 的实例
15 * args : method.invoke() 需要的实际参数值
16 */
17 public class DynamicProxyTest {
18 public static void main(String[] args) {
19 DynamicProxyHandler dph = new DynamicProxyHandler();
20 Boss cb = (Boss) dph.newProxyInstance(new CoalBoss());
21 cb.meet();
22 cb.consume();
23
24 Boss sb = (Boss) dph.newProxyInstance(new SteelBoss());
25 sb.meet();
26 sb.consume();
27 }
28 }
29
30 class DynamicProxyHandler implements InvocationHandler {
31
32 // 目标对象
33 private Object target;
34
35 // 生成动态代理对象
36 public Object newProxyInstance(Object target) {
37 this.target = target;
38
39 /*
40 * 第一个参数:通常与目标对象的类加载器一致。(目标对象由哪个类加载器加载,动态代理类就由哪个类加载器加载)
41 * 第二个参数:通常与目标对象实现的接口保持一致。(实现了哪些接口,就相当于有哪些方法)
42 * 第三个参数:需要实现了 InvocationHandler 接口实现类的实例。(目的执行该接口中的 invoke() 方法)
43 * invoke 动态执行目标对象的方法(Method实例)
44 */
45 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
46 }
47
48 @Override
49 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
50 System.out.println("-----------代理开始-----------");
51
52 Object obj = method.invoke(target);
53
54 System.out.println("-----------代理结束-----------");
55
56 return obj;
57 }
58
59 }