`
喻红叶
  • 浏览: 41119 次
  • 性别: Icon_minigender_1
  • 来自: 哈尔滨
社区版块
存档分类
最新评论

Java代理模式的理解(一)

    博客分类:
  • java
 
阅读更多

一 静态代理模式

在静态代理模式中有三类角色,理解了这三类角色也就理解了代理模式:

a.抽象对象:定义了真实角色和抽象角色的公共接口(可以是类,也可以是接口)Subject;

b.代理角色:代理角色内部包含有对真实角色的引用,通过这个引用去执行真实角色想要完成的任务;除此之外,代理角色可以完成其他的一些功能;

c.真实角色:实际要完成任务的角色,是我们始终要引用的对象。

代理角色和真实角色均实现了(或继承了)抽象角色。

写一段代码来举例:

 

//抽象角色,定义公共部分
interface Subject { 
    public void request();
}

//真实角色
class RealSubject implements Subject {
    public void request() {
        do something;
   } 
}

//抽象角色,内部保存真实角色的引用
class ProxySubject implements Subject {
    private RealSubject sub;
    
    public ProxySubject(RealSubject obj) {
        this.sub = obj;//获得真实角色的实例引用
    }

   public void request() {
       sub.request();//通过真实角色的引用去执行最终要完成的任务
  }
}

public static void main(String[] args) {
		Subject proxy = new ProxySubject();
		proxy.request();
}

 

 

二 动态代理模式

在学习动态代理模式时,学完了整个过程,我还是没有理解,下面的描述是我从自己理解的角度出发的,也许不适合别人阅读,也许会产生共鸣。

动态代理模式也是代理模式,所以它也会有三种角色。

   抽象角色,定义公共部分,interface Subject;

   真实角色,完成实际的工作,class RealSubject implements Subject。

 

  class DynamicSubject:里面保存真实角色的引用,实现了InvocationHandler接口,InvocationHandler接口中有一个invoke方法,接受三个参数:

             一个是代理实例;

              一个是要执行方法的Method对象,通过调用Method对象的invoke()方法,便可以执行该方法了;

              一个是执行该方法所需要的参数。

 

 在使用动态代理模式时,首先需要得到真实角色的一个实例:RealSubject real = new RealSubject();

DynamicSubject实现了InvocationHandler接口,DynamicSubject里保存了一个真实角色的引用sub,通过构造方法来得到它:InvocationHandler handler = new DyanmicSubject(real);

 

接下来就是通过Proxy动态的生成一个动态代理类(也就是代理模式中的代理角色),分析一下,如果要生一个代理类需要哪些条件?根据静态代理来分析:

 (1)要实现Subject接口,谁实现了Subject接口?RealSubject!所以需要RealSubject实现的接口的列表:RealSubject.class.getInterfaces()。

 (2)要实现Subject中的方法。但是动态代理把执行方法的任务交给了InvocationHandler,所以需要一个InvocationHandler的对象。

Proxy动态生成了该代理类后,返回一个该类的实例。想一想,代理模式的前提是什么?是有一个定义了公共部分的接口Subject,由Subject的一个实例去调用要执行的方法。生成的动态代理类实现了哪个接口?Subject!所以返回的该动态代理类的实例必定是Subject类型的:

   Subject sub = (Subject)动态代理类实例;

   sub.调用要执行的方法;

回想一下:动态代理模式把执行方法的任务交给了InvocationHandler,所以sub.调用要执行的方法这一步实际上是把执行动作转移到了handler上了,调用了handler的invoke方法。handler的invoke方法再去调用实际要执行方法的Method对象的invoke()方法。

 

以上的描述可能比较乱,总结一下:

 (1)动态代理模式,也需要三种角色:抽象角色Subject;真实角色RealSubject;代理角色,由Proxy动态生成。

(2)动态代理模式把执行方法的任务交给了InvocationHandler,所以需要一个类去实现InvocationHandler接口,并且实现invoke方法。

 (3)生成动态代理类需要三个条件:类加载器;真实角色实现的接口列表;handler。需要handler的原因是因为:方法最终是在handler的invoke()方法中执行;在生成动态代理类的实例时,完成代理类和handler的关联。

//抽象角色
public interface Subject {
   public void request();
}

//真实角色
public class RealSubject implements Subject {

	@Override
	public void request() {
		System.out.println("From real Subject");

	}

}

//InvocationHandler
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/*
 * 该代理类内部的属性是Object类型,实际使用的时候通过构造方法传递进来一个对象sub
 * 此外,该类还实现了invoke方法,该方法中的method.invoke其实就是调用被代理对象将要执行的方法,
 * 方法参数是sub,表示该方法从属于sub
 * 
 */
public class DynamicSubject implements InvocationHandler {
	
	private Object sub;
	
	public DynamicSubject(Object obj) {
		this.sub = obj;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		System.out.println("before : " + method);
		System.out.println("method name : " + method.getName() + "," + args);
		method.invoke(sub, args); 
		System.out.println("after : " + method);	
		
		return null;
	}

}


public class Client {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		RealSubject realSubject = new RealSubject();
		InvocationHandler handler = new DynamicSubject(realSubject);
		
		Class<?> clazz = handler.getClass();
		
		//下面的代码一次性生成代理
		//完成两件事:动态生成一个代理类,并且生成这个类的一个实例
		Subject subject = (Subject) Proxy.newProxyInstance(clazz.getClassLoader(),
				RealSubject.class.getInterfaces(), handler);
		
		subject.request();//实际上将是将方法的执行转移到了handler上了,调用handler.invoke()方法
		System.out.println(subject.getClass());
	}

}

 

 

 

分享到:
评论

相关推荐

    Java代理模式Java动态代理

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

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

    在Java编程领域,设计模式是一种解决常见问题的...理解并熟练运用代理模式,能够帮助开发者更好地设计和优化系统,提高代码的灵活性和可扩展性。在实际项目中,可以根据需求选择静态代理或动态代理,灵活应对各种场景。

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

    代理模式是这些模式中的一种,它的主要作用是在不改变原有对象行为的前提下,为对象添加额外的功能或者控制访问。在这个“Java设计模式-代理模式例子”中,我们将深入探讨代理模式的概念、实现方式以及它在实际开发...

    JAVA设计模式(代理模式)

    代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原对象的访问。在实际应用中,代理模式常...

    Java 静态代理模式

    Java静态代理模式是一种设计模式,它允许我们为一个对象提供一个代理,以便增强或扩展其功能,同时不改变原有对象的代码。在Java中,静态代理是通过在代理类中显式实现目标接口来实现的。下面将详细介绍静态代理模式...

    java中的三种代理模式

    在Java编程中,代理模式是一种常用的面向对象设计模式,它允许我们为一个对象提供一个代理以控制对该对象的访问。代理模式通常用于增加额外的功能,如日志、权限检查等,或者为了创建虚拟代理以提高性能。以下是Java...

    JAVA 设计模式 工厂模式 代理模式 迭代模式 责任链模式 源码

    以下是关于JAVA设计模式中提及的四种模式——工厂模式、代理模式、迭代器模式以及责任链模式的详细说明。 1. **工厂模式**:工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,当创建...

    java的设计模式.对java设计模式的理解.

    7. 代理模式:为其他对象提供一种代理以控制对这个对象的访问,如远程代理、虚拟代理和保护代理。 8. 组合模式:将对象组织成树形结构,可以表示部分-整体的层次结构,使得客户端可以一致地处理单个对象和对象集合...

    Java代理模式例子

    Java代理模式 事例很生动,非常容易理解,推荐给大家。

    对代理模式与Java动态代理类的理解

    对代理模式与Java动态代理类的理解说明

    用Java实现的代理模式之动态代理

    `代理模式之动态代理.exe`可能是一个视频播放程序,其中详细讲解了如何实现和理解动态代理。`代理模式之动态代理.ppt`则可能是一个PPT文档,提供了代理模式的理论介绍和代码示例。 4. **学习与实践** 要深入理解...

    java设计模式视频教程-代理模式.rar

    在这个“java设计模式视频教程-代理模式.rar”压缩包中,包含了一部关于代理模式的视频教程,以及相关的课件和示例代码。 代理模式的核心思想是通过代理类来代理原始对象,为原始对象提供一个替代品或占位符,以...

    java代理模式

    代理模式是一种设计模式,它是软件开发中的一种结构型模式,主要用来在客户端和目标对象之间创建一个代理对象,代理对象负责控制对目标对象的访问。代理模式的核心思想是为一个对象提供一个代理,并由代理对象控制对...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂

    在代理模式中,一个类代表另一个类的功能。这种模式常用于控制对某个对象的访问,以增强原对象的功能,比如在访问原对象之前进行权限检查、日志记录或实现缓存策略。在Java实现中,有静态代理和动态代理两种方式。...

    java 代理模式详解

    总结一下,Java代理模式的核心在于`Proxy`类和`InvocationHandler`接口,它们共同实现了在运行时动态创建符合特定接口的代理对象。通过代理,我们可以在不修改原始对象代码的情况下,添加额外的功能或者控制对原始...

    java代理模式示例源码

    在给定的“java代理模式示例源码”中,我们可以通过房产中介的例子来理解这种模式。 房产中介在现实生活中,是客户与房东之间的桥梁,它可以代表客户处理租赁事宜,也可以在房东和客户之间传递信息,这与代理模式的...

    Java 代理模式

    Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理对象,该代理对象在调用实际对象的方法之前或之后可以执行额外的操作。这在不修改原有对象代码的情况下,提供了扩展功能的可能性。代理模式通常分为两...

    JAVA设计模式(java设计)

    - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 - 模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。 3. 行为型模式: - 责任链模式:使多个对象有机会处理请求,从而避免请求...

    java静态代理、动态代理、装饰设计模式

    在Java编程中,代理模式是一种常见的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能统计等。...

    JAVA设计模式例程-代理模式

    在这个"JAVA设计模式例程-代理模式"的压缩包中,我们可以深入学习如何在Java中实现这一模式。 1. **代理模式的基本概念** 代理模式的核心思想是为一个目标对象创建一个代理对象,代理对象在客户端和目标对象之间起...

Global site tag (gtag.js) - Google Analytics