代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制原对象的引用。
代理模式的示意性实现类图如下
- 抽象主题角色:声明了真实主题与代理主题的共同接口,这样在可以使用真实主题的地方都可以使用代理主题。
- 代理主题角色:包含了一个对真实主题角色的引用,从而可以在任何时候操作真实主题角色。
代理模式的时序图如下
代理模式是怎样工作的:
- 代理主题并不改变主题的接口,因为模式的用意是不让客户端感觉到代理的存在。
- 代理使用委派将客户端的调用传递给真实主题对象,代理起的到是一个传递请求的作用。
- 代理主题在传递调用之前和之后都可以执行特定的操作,而不是单纯的传递请求。
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与模式》
相关推荐
在这些模式中,代理模式(Proxy Pattern)是一种常用的结构型设计模式,它允许我们为一个对象创建一个代理,该代理对象在客户端和目标对象之间起到中介的作用,可以增加额外的功能或控制访问。 代理模式分为两种...
在本实例中,我们将深入探讨Java中的代理模式及其应用。 代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用。它可以控制目标对象的访问,也可以在调用目标对象的...
### Java设计模式之虚拟代理模式详解 #### 一、引言 在软件工程领域,设计模式作为一种被广泛接受的最佳实践,对于提高代码质量和可维护性起着至关重要的作用。其中,“代理模式”作为结构型设计模式之一,在解决...
在Java中,代理模式可以通过多种方式实现,包括静态代理和动态代理。 在提供的文件列表中,我们可以看到以下几个关键类: 1. `ProxyDisplay`:这个名字暗示了它可能是代理模式中的代理类,用于代表或代替某个实际...
在这个“Java设计模式-代理模式例子”中,我们可能能看到如何创建静态代理类,以及如何利用`Proxy`和`InvocationHandler`创建动态代理。源码分析可以帮助我们更好地理解代理模式的实现细节,并能将其运用到自己的...
**设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...
在Java世界中,代理模式有多种实现方式,其中最常见的是JDK动态代理和CGLIB库。JDK动态代理基于接口实现,它要求目标对象必须实现至少一个接口,然后通过Proxy类和InvocationHandler接口来创建并控制代理对象。当...
1. **真实对象(Real Subject)**:这是代理模式要代理的目标对象,它实现了与代理对象相同的接口,使得代理对象可以代替它进行工作。 2. **代理对象(Proxy)**:代理对象持有真实对象的引用,并提供与真实对象相同...
Java提供了一个内置的机制来实现动态代理,即`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。 1. **定义接口**:与静态代理相同,我们依然需要一个业务接口`Service`。 2. **实现...
总结来说,"proxy.rar"压缩包提供了Java编程中三种代理模式的源代码实例,通过学习这些代码,开发者可以深入理解代理模式的原理和实现,同时掌握泛型在实际项目中的应用。对于提高代码的可扩展性和可维护性,这些都...
了解并熟练掌握代理模式,对于提高Java开发中的设计质量与可维护性具有重要意义。在实践中,应根据具体需求选择合适的代理实现方式,以达到最佳的设计效果。通过学习和实践,开发者可以更好地理解和运用这一模式,...
在Java中实现代理模式,通常有两种方式:静态代理和动态代理。 首先,我们来看静态代理。静态代理是通过创建一个代理类来实现对目标对象的代理,这个代理类和目标类具有相同的接口,代理类在调用目标对象方法时可以...
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
代理模式是一种设计模式,属于结构型模式之一,其主要目的是为其他对象提供一个代理,以控制对该对象的访问。在实际应用中,代理模式能够帮助我们实现如下的功能: 1. 远程代理:代理对象可以代表一个位于远程系统...
Java的动态代理是一种强大的设计模式,它允许在运行时创建具有特定行为的代理对象,这些对象可以代替原对象执行某些任务。动态代理机制是Java语言提供的一种反射特性,主要用于实现AOP(面向切面编程)或者对现有...
在这个主题“代理模式java代码 Proxy(5) 2个代理类”中,我们可以理解为将介绍两种不同的代理类实现。 1. 静态代理 在静态代理中,我们需要创建一个接口,然后让目标对象和代理对象都实现这个接口。代理类会持有...
标题中的“从房屋买卖看 java proxy 模式”暗示了我们将通过一个具体的场景来探讨 Java 中的代理(Proxy)模式。在软件设计中,代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在...
结构型模式如适配器(Adapter)、装饰器(Decorator)和代理(Proxy)等,关注如何组合对象和类,以实现新的功能或改善原有结构。行为型模式如观察者(Observer)、模板方法(Template Method)和策略(Strategy)等...
Java中的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口可以实现动态代理。动态代理在Android中常用于实现事件监听、AOP(面向切面编程)等场景。 **Android中的应用** 1. **数据加载**...