代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制原对象的引用。
代理模式的示意性实现类图如下
- 抽象主题角色:声明了真实主题与代理主题的共同接口,这样在可以使用真实主题的地方都可以使用代理主题。
- 代理主题角色:包含了一个对真实主题角色的引用,从而可以在任何时候操作真实主题角色。
代理模式的时序图如下
代理模式是怎样工作的:
- 代理主题并不改变主题的接口,因为模式的用意是不让客户端感觉到代理的存在。
- 代理使用委派将客户端的调用传递给真实主题对象,代理起的到是一个传递请求的作用。
- 代理主题在传递调用之前和之后都可以执行特定的操作,而不是单纯的传递请求。
JDK动态代理
jdk的动态代理是基于接口的,必须实现了某一个或多个任意接口才可以被代理,并且只有这些接口中的方法会被代理。
在Dao类的方法调用前输出xxx方法 start
public interface UserDao { public void save(); public void delete(); }
public class UserDaoImpl implements UserDao { @Override public void delete() { // TODO Auto-generated method stub System.out.println("deleted"); } @Override public void save() { // TODO Auto-generated method stub System.out.println("save"); } }
public class DaoProxy implements InvocationHandler { private Object target; public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(method.getName()+" start!"); method.invoke(target,args); return null; } }
public static void main(String[] args) { UserDao uDao = new UserDaoImpl(); DaoProxy log = new DaoProxy(); log.setTarget(uDao); UserDao uDaoProxy = (UserDao)Proxy.newProxyInstance(uDao.getClass().getClassLoader(), uDao.getClass().getInterfaces(), log); uDaoProxy.delete(); uDaoProxy.save(); }
运行结果
delete start!
deleted
save start!
save
deleted
save start!
save
CGlib
- cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
- cglib封装了asm,可以在运行期动态生成新的class。
- cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。
Spring中AOP是基于代理的思想来实现,其代理就是基于CGlib来实现的。
参考:《Java与模式》
相关推荐
代理模式java代码 Proxy(4) 开发宝典......
代理模式java代码 Proxy(1) java 学习必备......
java 代理模式实现代码及设计详解:动态代理模式、静态代理模式
代理模式java代码 Proxy(5) 2个代理类 开发宝典
代理模式又叫Proxy模式(英文)。所谓的代理,就是一个人或者一个机构代替另一个人或者另一个机构去做一些事情。(类似于中介或者代理商)。
java三种代理模式的源码,包含泛型改写
java.proxy,代理模式源码,设计模式,apache开源项目源码commons-proxy-1.0-src 各种代理模式操作的工具类源码以及代理模式案例源码,你会从中得到意想不到的效果! apache开源组织开发的开源项目源码,其优良的代码...
详解设计模式中的proxy代理模式及在Java程序中的实现共14页.pdf.zip
代理模式java代码 Proxy(3) 开发必备宝典......
代理模式java代码 Proxy(2) 开发必备宝典......
这是JAVA设计模式中属于结构模式的部分,包括Flyweight(共享模式)、Bridge(桥模式)、Decorator(装饰模式)、Composite(组合模式)、Adapter(适配器模式)、Proxy(代理模式)、Facade (外观模式)的源代码。其中有些模式中...
设计模式之Proxy(代理) 设计模式之Adapter(适配器) 设计模式之Composite(组合) 设计模式之Decorator(油漆工) 设计模式之Bridge 设计模式之Flyweight(享元) 行为模式: 设计模式之Template 设计模式之Memento(备忘机制...
JAVA Proxy 代理模式
我自己用eclipse写的java代码,可以直接用eclipse导入,也可以直接用java -jar proxy_sample.jar执行 代码量很小,尽量通过注释进行说明 本例实现了InvocationHandler...在研究代理模式(Proxy模式)的朋友可以交流一下
java设计模式,代理模式
- 静态代理与动态代理 - 常见的动态代理实现 - JDK Proxy - CGLIB - JDK Proxy 和 CGLIB 的对比 - 动态代理的实际应用 - Spring AOP 说在前面:今天我们来聊一聊 Java 中的代理,先来聊聊故事背景: 小明想...
java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法...
java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...
第11章 代理(proxy)模式 97 第12章 职责链(chain of responsibility)模式 115 第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 构建者(builder)模式 134 第16章 工厂方法(factory method)模式 141...
代理模式(Proxy Pattern) 3 行为型模式 这些设计模式特别关注对象之间的通信。 责任链模式(Chain of Responsibility Pattern) 命令模式(Command Pattern) 解释器模式(Interpreter Pattern) 迭代器模式...