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. 拦截器:
    设计者往往会用拦截器代替动态代理提供给开发者使用,降低开发难度
    拦截器的工作流程:
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    C#使用BouncyCastle操作国密SM3
    Win10 2004种子
    Excel对比两列数据,找到重复项
    CentOS7 + frp远程访问内网Windows电脑
    Docker on Mac OS
    MySQL5.6中查询多边形包含点情况(ST_Contains、ST_Within)
    SQL查询表的所有字段名
    清除文本中Html的标签
  • 原文地址:https://www.cnblogs.com/shawshawwan/p/9216895.html
Copyright © 2011-2022 走看看