1、静态代理

被代理对象和代理对象都要实现相同的接口或者继承相同的父类。

不需要修改被代理对象就可以实现对功能的扩展,缺点是如果接口发生变化,比如增加新方法,被代理对象和代理对象都需要维护。

1)首先定义一个接口

public interface ITeachTask {void teach();
}

2)被代理对象的类

public class TeachTask implements ITeachTask{@Overridepublic void teach() {System.out.println("teaching");}
}

3)代理对象

/*** 代理对象,实现接口,* 不需要修改被代理对象* 但是如果接口发生变更,需要同时维护代理对象*/
public class TeachProxy implements ITeachTask{private ITeachTask teachTask;public TeachProxy(ITeachTask teachTask) {this.teachTask = teachTask;}@Overridepublic void teach() {System.out.println("proxy teach start");teachTask.teach();System.out.println("proxy teach end");}
}

4)测试

/*** 静态代理模式*/
public class Test {public static void main(String[] args) {TeachTask teachTask = new TeachTask();TeachProxy proxy = new TeachProxy(teachTask);proxy.teach();}
}

2、JDK 代理

利用 Java API 动态生成代理对象,Proxy.newProxyInstance()方法动态生成代理类和代理对象,因为这个方法的第二个参数,有一个局限性,就是被代理对象必须要实现某个接口。

/*** 代理对象不需要实现接口,但是目标对象一定要实现接口* */
public class ProxyFactory {private Object object;public ProxyFactory(Object object) {this.object = object;}public Object getProxyObject() {Object proxyObject = Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("jdk proxy start");Object returnValue = method.invoke(object, args);System.out.println("jdk proxy end");return returnValue;}});return proxyObject;}
}

测试类:

public class Test {public static void main(String[] args) {ITeachTask teachTask = new TeachTask();ITeachTask proxy = (ITeachTask) new ProxyFactory(teachTask).getProxyObject();proxy.teach();}
}

3、CGLIB 代理

需要引入cglib jar 包,这里用的是3.1版本,maven 依赖为:

<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.1</version>
</dependency>

创建一个子类对象从而实现对目标对象功能的扩展。

1)被代理对象

public class TeachTask {public void teach() {System.out.println("teaching");}
}

2)代理

public class ProxyFactory implements MethodInterceptor {private Object object;public ProxyFactory(Object object) {this.object = object;}public Object getProxyObject() {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(object.getClass());enhancer.setCallback(this);return enhancer.create();}@Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("cglib proxy start");//执行目标对象的方法Object returnValue = methodProxy.invokeSuper(obj, args);System.out.println("cglib proxy end");return returnValue;}
}

测试代码:

public class Test {public static void main(String[] args) {TeachTask teachTask = new TeachTask();TeachTask proxyObject = (TeachTask) new ProxyFactory(teachTask).getProxyObject();proxyObject.teach();}
}

Java 设计模式之代理模式相关推荐

  1. Java 设计模式_代理模式(2016-08-19)

    概念: 代理模式是对象的结构模式.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 就是一个人或者机构代表另一个人或者机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...

  2. Java设计模式(三) -- 代理模式

    代理是一种设计模式,即通过代理对象访问目标对象,这样可以在目标对象实现的基础上,增强额外的功能,即扩展目标类的功能. 通常编程中存在一种思想,即不要随意修改别人的代码或者方法,所以代理就可以在不修改目 ...

  3. java设计模式之代理模式详解

    代理模式在Java中十分常见,有如Spring实现AOP而使用动态代理,更有RPC实现中使用的调用端调用的代理服务.代理模型除了是一种设计模式之外,它更是一种思维,所以探讨并深入理解这种模型是非常有必 ...

  4. java设计模式之代理模式多种写法(三)

    背景 代理模式属于结构型模式,代理模式也是我们开发中常用的设计模式之一,本次讲解以下几种代理模式的写法,希望可以帮助大家更快的理解代理模式,包括自己写一个动态代理的方法. 静态代理 package c ...

  5. Java设计模式之代理模式(Proxy)

    参考http://blog.csdn.net/jianghuxiaoxiami/article/details/3403924 1.代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的 ...

  6. Java设计模式-Proxy代理模式

    问题分析: 什么是代理模式呢?其实我们在生活中并不少见.对于程序员来说最常接触的莫过于代理上网了,连接大力服务器地址,就可以访问网络. 还有每天吃饭赶进度是常事,叫公司的同事帮忙带饭也是一种代理:如果 ...

  7. java设计模式之——代理模式

    1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象 ...

  8. Java设计模式之代理模式

    示例为最经典的西门庆示例 1,什么是代理模式? 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问. 2,策略模式有什么好处? 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理 ...

  9. Java设计模式-之代理模式(动态代理)

    一.简介 1.什么叫代理模式:        简而言之就是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起 ...

最新文章

  1. 你真的会写单例模式吗?
  2. 防火墙 加密 专用虚拟网 安全隔离 必然会不断浓缩
  3. eip协议通信_3月免费公开课伺服、通信等课程重磅发布,火热报名中
  4. 4、提高插入数据的速度
  5. BZOJ2956 (模积和)
  6. 信息学奥赛C++语言: 趣味整数5(勾股数)
  7. 微信小程序图片四个API用法
  8. linux下 VSCode快捷键
  9. H3C交换机console口Xshell连接
  10. markdown快捷键大全
  11. zoj3551 Bloodsucker//概率dp
  12. 前端面试题型汇总(适合应届/社招1年水平)
  13. WMS和WMTS的区别
  14. 【bzoj 1340】 Escape逃跑问题 【Baltic2007】
  15. pandas 选择满足特定条件的行
  16. CTF--RsaCtfTool安装
  17. Excel中删除重复数据(用VBA代码)
  18. 面试了华为软件测试工程师(简单分享一下)
  19. css多行注释代码,css多行注释怎么写
  20. vant树型菜单多级_iOS 动态树形结构 - 实现多级菜单,附带复选框功能

热门文章

  1. Java中什么时候throws_何时在Java方法声明中使用throws?
  2. oracle 论坛 千万级表,Oracle千万级记录操作总结
  3. java spring getbean_spring依赖注入中获取JavaBean
  4. java mvc web_JavaWeb MVC
  5. manjaro 搜狗输入法_Manjaro日常使用 之一:日常办公
  6. Codeforces Round #350 (Div. 2) B. Game of Robots 水题
  7. node.js学习之react,redux,react-redux
  8. android smartbar适配
  9. php curl nginx post 空_【青藤云安全研究】绕过php的disable_functions(上篇)
  10. 语言程序设计 郭有强_「概念篇8」程序语言如何被计算机理解?靠猜?那就搞笑了...