代理模式

静态代理模式

  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 }
原文地址:https://www.cnblogs.com/yonxin/p/12554848.html