代理模式

最近看公司的轮子,发现一个 api服务动态代理。于是打算详细看一下代理模式。动态代理很重要,很多框架底层都是基于它实现的。 

代理模式及其变体分为很多种:有远程代理、虚拟代理、保护代理,变体有缓存代理、同步代理、防火墙代理和写入时复制代理。

代理的步骤一般分为:

1)代理对象和真实对象建立代理关系

2) 实现代理对象的代理逻辑方法

 1. JDK动态代理:

Java内置的代理支持,可以根据需要建立动态代理,并将所有调用分配到所选的处理器。
 
 1 public interface HelloWorld {
 2     public void sayHelloWorld();
 3 }
 4 
 5 
 6 
 7 public class HelloWordImpl implements HelloWorld {
 8     @Override
 9     public void sayHelloWorld() {
10         System.out.println("Hello, World");
11     }
12 }
13 
14 
15 
16 public class JdkProxyExample implements InvocationHandler {
17 
18     private Object target = null; //被代理的对象
19 
20     public Object bind(Object target) {
21         this.target = target;
22         return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
23     }
24 
25     @Override
26     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
27         System.out.println("进入代理逻辑的方法");
28         System.out.println("在调度真实对象之前的服务");
29         Object obj = method.invoke(target, args); //相当于调sayHelloWorld方法
30         System.out.println("在调度真实对象之后的服务");
31         return obj;
32     }
33 
34     /**
35      * 制定代理的逻辑类
36      */
37     public static void testJDKProxy() {
38         JdkProxyExample jdkProxy = new JdkProxyExample();
39         HelloWorld proxy = (HelloWorld) jdkProxy.bind(new HelloWordImpl());
40         proxy.sayHelloWorld();
41     }
42 
43     public static void main(String[] args) {
44         JdkProxyExample.testJDKProxy();
45     }
46 }
 
 
 
 2. 拦截器:
设计者往往会用拦截器代替动态代理提供给开发者使用,降低开发难度
拦截器的工作流程:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/shawshawwan/p/9216895.html