无处不在的模式——Proxy

最近在看《设计模式之禅》,看到代理模式这一章的时候,发现自己在写spring项目的时候其实很多时候都用到了代理,无论是依赖注入、AOP还是其他,可以说是无处不在。

于是自己便自己摸索写了一些小例子,当然也参考了网上其他博主的博客,毕竟小白一枚hhhhhh

进入正题:

                          

图1-1:代理Proxy

代理模式现在主流的有两大类:1、JDK代理    2、CGLB代理

(JDK静态代理就不说了,网上很多都有,主要我觉得现在面向企业项目,静态代理局限性有点大,对于我而言可能就只是去了解了一下,而并没有说想要去深入这个)

Th1:JDK动态接口代理(需要实现InvocationHandler接口中的invoke(...)方法,必须实现某个接口)

public class MyJdkProxy implements InvocationHandler {

    // 目标对象
public Object target; // 初始化传入代理对象
public MyJdkProxy(Object target){
this.target = target;
} @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("xsc");
return method.invoke(target,args);
} public Object newProxy(){
// 获取代理目标对象实例
return Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
this
);
}
}

Th2:CGLB动态接口代理(需要实现MethodInterceptor接口中的intercept(...)方法,当然也可无需实现接口,可直接代理类)

public class MyCgljProxy implements MethodInterceptor {

    // 目标对象
public Object target; // 初始化传入代理对象
public MyCgljProxy(Object target){
this.target = target;
} @Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("cj");
return methodProxy.invoke(target,objects);
} public Object newProxy(){
// 获取代理目标对象实例
return Enhancer.create(target.getClass(),this);
}
}

Th3:测试类Test.java

public class Test{
// 需要代理的接口
interface Subject{
void sayHi();
void sayHallo();
} // 代理接口实现类
static class SubjectImpl implements Subject{ @Override
public void sayHi() {
System.out.println("Hi");
} @Override
public void sayHallo() {
System.out.println("Hello");
}
} public static void main(String[] args) {
// JDK动态接口代理方式
Subject target1 = new SubjectImpl();
MyJdkProxy proxy = new MyJdkProxy(target1);
target1 = (Subject) proxy.newProxy(); target1.sayHallo();
target1.sayHi(); System.out.println("----------------------------"); // CGLB动态接口代理方式
Subject target2 = new SubjectImpl();
MyCgljProxy myCgljProxy = new MyCgljProxy(target2);
target2 = (Subject) myCgljProxy.newProxy();
target2.sayHi();
target2.sayHallo();
}
}

Th4:测试结果

总结:

当然这些只是简单的代理,感觉其实一通百通,目的都是为对象提供个代理来控制对其的访问,而我们的代理类则委托预处理、过滤、转发消息,以及委托后进行的后续处理,解决了在直接访问对象时可能带来的问题

革命尚未成功,同志仍需努力~~~~

初识代理——Proxy的更多相关文章

  1. 代理(Proxy)和反射(Reflection)

    前面的话 ES5和ES6致力于为开发者提供JS已有却不可调用的功能.例如在ES5出现以前,JS环境中的对象包含许多不可枚举和不可写的属性,但开发者不能定义自己的不可枚举或不可写属性,于是ES5引入了O ...

  2. 深度揭秘ES6代理Proxy

    最近在博客上看到关于ES6代理的文章都是一些关于如何使用Proxy的例子,很少有说明Proxy原理的文章,要知道只有真正掌握了一项技术的原理,才能够写出精妙绝伦的代码,所以我觉得有必要写一篇关于深刻揭 ...

  3. Webpack代理proxy配置,解决本地跨域调试问题,同时允许绑定host域名调试

    Webpack代理proxy配置,解决本地跨域调试问题,同时允许绑定host域名调试 会撸码的小马 关注 2018.05.29 17:30* 字数 212 阅读 1488评论 0喜欢 2 接到上一章, ...

  4. 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance

    浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...

  5. JAVA设计模式-动态代理(Proxy)示例及说明

    在Mybatis源码解析,一步一步从浅入深(五):mapper节点的解析文章的最后部分,我们提到了动态代理的概念,下面我们就简单了解一下动态代理. 一,概念 代理设计模式的目的就是在不直接操作对象的前 ...

  6. JAVA设计模式-动态代理(Proxy)源码分析

    在文章:JAVA设计模式-动态代理(Proxy)示例及说明中,为动态代理设计模式举了一个小小的例子,那么这篇文章就来分析一下源码的实现. 一,Proxy.newProxyInstance方法 @Cal ...

  7. java动态代理--proxy&cglib

    大纲 代理 proxy cglib 小结 一.代理 为什么要用代理?其实就是希望不修改对象的情况下,增强对象. 静态代理: 静态代理模式,需要代理类和目标类实现同一接口,代理类的方法调用目标类的方法, ...

  8. 神秘代理-Proxy

    前言: 代理模式作为常见的设计模式之一,在项目开发中不可或缺.本文就尝试着揭开代理的神秘面纱,也欢迎各路人批评指正! 1.如何实现代理: [假设有个关于汽车移动(move)的计时需求]设计:Movea ...

  9. 动态代理proxy与CGLib的区别

    什么是代理? 静态代理与动态代理 静态代理实例 JDK动态代理实例 CGLib 简介 CGLib 与JDK动态代理的区别 代理模式是Java中常见的一种模式,英文名字叫走Proxy或者Surrogat ...

随机推荐

  1. 线性模型之LDA和PCA推导

    线性模型之LDA和PCA 线性判别分析LDA LDA是一种无监督学习的降维技术. 思想:投影后类内方差最小,类间方差最大,即期望同类实例投影后的协方差尽可能小,异类实例的投影后的类中心距离尽量大. 二 ...

  2. ZOJ 3955:Saddle Point(思维)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3955 题意:给出一个n*m的矩阵,定义矩阵中的特殊点Aij当且仅当Aij是 ...

  3. C语言实现—学生成绩管理系统(Linux下运行)

    开发环境:Linux 开发语言:C 相关文件下载: 码云:https://gitee.com/ikaros-521/c_project/tree/master/%E5%AD%A6%E7%94%9F%E ...

  4. 哈工大计算机网络Week1-网络应用

    目录 哈工大计算机网络Week1-网络应用 2.1网络应用的体系结构 特点 应采取什么结构 C/S结构 客户机/服务器 P2P CS vs P2P 混合结构 思考题目 2.2网络应用的基本原理 网络应 ...

  5. C语言指针专题——为何要学习指针

    欢迎转发本文! 之前的文章与各位谈论了指针是什么,以及指针为何这那么难学.不少知友留言说看了我的文章对指针了解了不少,这给我继续创作提供了莫大的动力啊.指针其实就是一个纸老虎,你看着可怕,等你了解其本 ...

  6. sql server 2008 NULL值

    SQL支持用NULL符号来表示缺少的值,它使用的是三值谓词逻辑,计算结果可是以TURE.FALSE或UNKNOWN. SQL中不同语言元素处理NULL和UNKNOWN的方式也有所不同,如果逻辑表达式只 ...

  7. 记录一次pycharm中,引入其他类可用,下面总是有波浪线,而且Ctrl+b 无法查看类函数的源码

    最近在玩python,发现引入其他的函数们总是有波浪线,但是能够使用,crtl+b却无法看到,非常尴尬,然后查看了原因,记录如下: This inspection detects names that ...

  8. Hybrid App从概念到实战

    最近一直在准备找工作,看了很多公司的招聘介绍,有相当一部分直接写:熟悉 Hybrid App 开发加分!正好,我司开发的就有这种 Hybrid App--使用WebViewJavascriptBrid ...

  9. Spring Cloud 之 Zuul基础.

    一.概述  API 网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的 Facade 模式,它的存在就像是整个微服务架构系统的门面一样,所有的外部客户端访问都需要经过它来进行调度和过滤 ...

  10. SpringCloud解析之Zuul(二)

    本文基于Spring Cloud Edgware.SR6,Zuul版本1.3.1,解析Zuul的请求拦截机制,让大家对Zuul的原理有个大概的认识和了解.如有不对的地方,欢迎指正. 在上一期的Spri ...