`

Java与模式之代理(Proxy)模式

阅读更多

代理模式是对象的结构模式。代理模式给某一个对象提供一个代理对象,并由代理对象控制原对象的引用。

代理模式的示意性实现类图如下




  • 抽象主题角色:声明了真实主题与代理主题的共同接口,这样在可以使用真实主题的地方都可以使用代理主题。
  • 代理主题角色:包含了一个对真实主题角色的引用,从而可以在任何时候操作真实主题角色。

 代理模式的时序图如下

 

代理模式是怎样工作的:

  • 代理主题并不改变主题的接口,因为模式的用意是不让客户端感觉到代理的存在。
  • 代理使用委派将客户端的调用传递给真实主题对象,代理起的到是一个传递请求的作用。
  • 代理主题在传递调用之前和之后都可以执行特定的操作,而不是单纯的传递请求。

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

 

CGlib 

  • cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
  • cglib封装了asm,可以在运行期动态生成新的class。
  • cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。

Spring中AOP是基于代理的思想来实现,其代理就是基于CGlib来实现的。

 

 

 

参考:《Java与模式》

 

 

 

 

 

 

  • 大小: 45.5 KB
  • 大小: 38.9 KB
分享到:
评论

相关推荐

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    在这些模式中,代理模式(Proxy Pattern)是一种常用的结构型设计模式,它允许我们为一个对象创建一个代理,该代理对象在客户端和目标对象之间起到中介的作用,可以增加额外的功能或控制访问。 代理模式分为两种...

    JAVA设计模式之代理模式实例

    在本实例中,我们将深入探讨Java中的代理模式及其应用。 代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用。它可以控制目标对象的访问,也可以在调用目标对象的...

    Java设计模式之代理模式(结构)

    ### Java设计模式之虚拟代理模式详解 #### 一、引言 在软件工程领域,设计模式作为一种被广泛接受的最佳实践,对于提高代码质量和可维护性起着至关重要的作用。其中,“代理模式”作为结构型设计模式之一,在解决...

    代理模式java代码 Proxy(4)

    在Java中,代理模式可以通过多种方式实现,包括静态代理和动态代理。 在提供的文件列表中,我们可以看到以下几个关键类: 1. `ProxyDisplay`:这个名字暗示了它可能是代理模式中的代理类,用于代表或代替某个实际...

    Java设计模式-代理模式例子

    在这个“Java设计模式-代理模式例子”中,我们可能能看到如何创建静态代理类,以及如何利用`Proxy`和`InvocationHandler`创建动态代理。源码分析可以帮助我们更好地理解代理模式的实现细节,并能将其运用到自己的...

    设计模式之代理模式proxy

    **设计模式之代理模式(Proxy Pattern)** 设计模式是软件工程中的一种最佳实践,它是在特定情境下解决常见问题的模板。代理模式是其中一种行为设计模式,它的核心思想是为一个对象提供一个替身或者代理,以控制对...

    设计模式之代理模式proxy.zip

    在Java世界中,代理模式有多种实现方式,其中最常见的是JDK动态代理和CGLIB库。JDK动态代理基于接口实现,它要求目标对象必须实现至少一个接口,然后通过Proxy类和InvocationHandler接口来创建并控制代理对象。当...

    设计模式之代理模式Proxy

    1. **真实对象(Real Subject)**:这是代理模式要代理的目标对象,它实现了与代理对象相同的接口,使得代理对象可以代替它进行工作。 2. **代理对象(Proxy)**:代理对象持有真实对象的引用,并提供与真实对象相同...

    Java设计模式——代理设计模式(静态代理和动态代理)

    Java提供了一个内置的机制来实现动态代理,即`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。 1. **定义接口**:与静态代理相同,我们依然需要一个业务接口`Service`。 2. **实现...

    proxy.rar java三种代理模式源码

    总结来说,"proxy.rar"压缩包提供了Java编程中三种代理模式的源代码实例,通过学习这些代码,开发者可以深入理解代理模式的原理和实现,同时掌握泛型在实际项目中的应用。对于提高代码的可扩展性和可维护性,这些都...

    JAVA设计模式(代理模式)

    了解并熟练掌握代理模式,对于提高Java开发中的设计质量与可维护性具有重要意义。在实践中,应根据具体需求选择合适的代理实现方式,以达到最佳的设计效果。通过学习和实践,开发者可以更好地理解和运用这一模式,...

    代理模式java代码 Proxy(1)

    在Java中实现代理模式,通常有两种方式:静态代理和动态代理。 首先,我们来看静态代理。静态代理是通过创建一个代理类来实现对目标对象的代理,这个代理类和目标类具有相同的接口,代理类在调用目标对象方法时可以...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    结构型模式之代理模式(Proxy)

    代理模式是一种设计模式,属于结构型模式之一,其主要目的是为其他对象提供一个代理,以控制对该对象的访问。在实际应用中,代理模式能够帮助我们实现如下的功能: 1. 远程代理:代理对象可以代表一个位于远程系统...

    java Proxy 动态代理

    Java的动态代理是一种强大的设计模式,它允许在运行时创建具有特定行为的代理对象,这些对象可以代替原对象执行某些任务。动态代理机制是Java语言提供的一种反射特性,主要用于实现AOP(面向切面编程)或者对现有...

    代理模式java代码 Proxy(5) 2个代理类

    在这个主题“代理模式java代码 Proxy(5) 2个代理类”中,我们可以理解为将介绍两种不同的代理类实现。 1. 静态代理 在静态代理中,我们需要创建一个接口,然后让目标对象和代理对象都实现这个接口。代理类会持有...

    从房屋买卖看 java proxy 模式

    标题中的“从房屋买卖看 java proxy 模式”暗示了我们将通过一个具体的场景来探讨 Java 中的代理(Proxy)模式。在软件设计中,代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在...

    java与模式光盘源码

    结构型模式如适配器(Adapter)、装饰器(Decorator)和代理(Proxy)等,关注如何组合对象和类,以实现新的功能或改善原有结构。行为型模式如观察者(Observer)、模板方法(Template Method)和策略(Strategy)等...

    Android设计模式之代理模式(Proxy Pattern)

    Java中的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口可以实现动态代理。动态代理在Android中常用于实现事件监听、AOP(面向切面编程)等场景。 **Android中的应用** 1. **数据加载**...

Global site tag (gtag.js) - Google Analytics