`
bolan392
  • 浏览: 277042 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java 代理(proxy)模式

阅读更多

   代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

  例如:

  diyblPic

package proxy;
interface Dao{
  public void insert();
}
class JdbcDao implements Dao{
public void insert(){
System.out.println("in jdbc insert");
}
}
class HibernateDao implements Dao{
public void insert(){
System.out.println("in hibernate insert");
}
}
class ProxyDao implements Dao{
private Dao dao;
public ProxyDao(Dao dao){
this.dao=dao;
}
public void insert() {
System.out.println("write log before invoke");
dao.insert();
System.out.println("write log after invoke");
}
}
public class Test {
public static void main(String[] args) {
Dao jdbcDao =new JdbcDao();
Dao proxydao = new ProxyDao(jdbcDao);
proxydao.insert();
}
}

 

   以上例子中使用了静态代理,而动态代理与静态代理的区别在于,动态代理中的代理类是由java.lang.reflect.Proxy类在运行期间根据接口定义,

和 java.lang.reflect.InvocationHandler结合,可以加强现有类的方法实现。如图2:

  


 

 所谓Dynamic Proxy是这样一种class:
它是在运行时生成的class,在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些interface。

你当然可以把该class的实例当作这些interface中的任何一个来用。当然啦,这个Dynamic Proxy其实就是一个Proxy,它不会替你作实质性的工作,

在生成它的实例时你必须提供一个handler,由它接管实际的工作。

例子

声明业务接口HelloWorld:

interface HelloWorld{
	public void sayHello();
	public String sayHelloWithReturnValue();
}

 声明业务接口的实现类:

class HelloWorldImple implements HelloWorld{

	public void sayHello() {
		System.out.println("执行了sayHello()");
	}

	public String sayHelloWithReturnValue() {
		String str = "HelloWorld";
		System.out.println("执行了 sayHelloWithReturnValue()");
		return str;
	}
	
} 

 

声明自定义handler类:

class HelloWorldHandler implements InvocationHandler{
	private Object target;//要代理的目标对象
	public HelloWorldHandler(){
	}
	public HelloWorldHandler(Object obj){
		this.target = obj;
	}
	public Object newProxy(Object obj){
		this.target = obj;
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);
	}
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result;
		doBefore();
		result = method.invoke(target, args);
		doAfter();
		return result;
	}
	private void doBefore(){
		System.out.println("before method invoke!");
	}
	private void doAfter(){
		System.out.println("after method invoke!");
	}
	
}

 

编写测试代码:

public static void main(String[] args) {
		HelloWorldHandler handler = new HelloWorldHandler();
		HelloWorld proxy = (HelloWorld)handler.newProxy(new HelloWorldImple());
		proxy.sayHello();
		String str = proxy.sayHelloWithReturnValue();
		System.out.println(str);
	}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    代理模式java代码 Proxy(4)

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

    从房屋买卖看 java proxy 模式

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

    代理模式java代码 Proxy(1)

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

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

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

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

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

    java实现Proxy例子

    我自己用eclipse写的java代码,可以直接用eclipse导入,也可以直接用java -jar proxy_sample.jar执行 代码量很小,尽量通过注释进行说明 本例实现了InvocationHandler...在研究代理模式(Proxy模式)的朋友可以交流一下

    java Proxy 动态代理

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

    Java代理模式Java动态代理

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

    Proxy 模式学习代码

    Proxy模式是一种设计模式,它允许我们为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用。这种模式在软件工程中广泛应用,主要用于控制对真实对象的访问,提供额外的功能,如日志、...

    Java 静态代理模式

    Java静态代理模式是一种设计模式,它允许我们为一个对象提供一个代理,以便增强或扩展其功能,...然而,由于其存在的局限性,如需更灵活的代理机制,可以考虑使用Java的动态代理模式(如Java.lang.reflect.Proxy)。

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

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

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

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

    java代理模式

    Java代理模式是一种设计模式,它在面向对象编程中扮演着重要的角色,主要目的是为了在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理模式的核心思想是通过代理类来间接调用目标类的方法,...

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

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

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

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

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

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

    JAVA设计模式(代理模式)

    二是JDK的动态代理API,如java.lang.reflect.Proxy类。动态代理更加灵活,不需要为每个目标类单独编写代理类。 3. **远程代理:**远程代理是代理模式的一个特殊应用,它使得客户端可以像操作本地对象一样操作远程...

    Java中的代理模式Demo

    在Java编程中,代理模式是一种设计模式,它允许我们在不修改原有对象的基础上,在对象周围创建一个代理对象,这个代理对象可以扩展目标对象的功能或者控制对目标对象的访问。代理模式通常用于实现动态代理、远程代理...

    代理模式java代码 Proxy(2)

    在Java中,`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口是实现动态代理的关键。`InvocationHandler`接口定义了一个`invoke()`方法,当通过代理对象调用方法时,实际会执行这个方法,...

    详解设计模式中的proxy代理模式及在Java程序中的实现

    Proxy模式是设计模式中的一种,它提供了一种对对象访问的控制手段,使得在不修改原有对象的基础上,可以通过代理对象来扩展或增强原有对象的功能。在Java编程中,Proxy模式的应用非常广泛,尤其是在处理远程调用、...

Global site tag (gtag.js) - Google Analytics