zoukankan      html  css  js  c++  java
  • 代理模式

    最近看公司的轮子,发现一个 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. 拦截器:
    设计者往往会用拦截器代替动态代理提供给开发者使用,降低开发难度
    拦截器的工作流程:
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    这是一段Java程序员写给最爱的老婆的代码。
    第一次来写博客,这里可以记录很多故事。
    转 JavaScript前端和Java后端的AES加密和解密
    java webservice浏览器测试地址
    Eclipse4.5在线安装Aptana插件及配置代码提示教程
    彻底的卸载干净oracle 11g(转)
    oracle查看编码以及修改编码(转)
    关于AngularJs数据递归呈现的实现的几种方式
    ionic的ngModel指令失效
    AngularJS 自定义指令详解
  • 原文地址:https://www.cnblogs.com/shawshawwan/p/9216895.html
Copyright © 2011-2022 走看看