`
yuping322
  • 浏览: 92999 次
  • 来自: ...
社区版块
存档分类
最新评论

Java中的代理模式

阅读更多
代理,想必大家都应该知道是什么冬冬了,一般的手机产商都有代理商,歌星们都有自己的经纪人,如此这些都可以看作是一种代理模式。下面我选择如下的一种情景来进行讲述:某董事长出差,但是此时公司有个聚会,董事长买单,但是由他的秘书去结帐。我们就权且把这个看作一个代理行为,^_^。

首先我们定义一个接口:商人(Merchant),如下所示:

package cn.edu.hust.cm.test;

public interface Merchant {

    void treat();//商人都要请客吃饭滴,^_^

}

然后我们定义一个类:董事长(Director),如下所示:

package cn.edu.hust.cm.test;

public class Director implements Merchant {

       public Director() {

       }

       public void treat() {

              System.out.println("董事长请大家吃饭");

       }

}

OK,我们现在要给他找代理了,这个代理就是他的秘书(Secretary)。这里要涉及到一些代理的机制了。在Java中,用来做代理的类一般都要实现InvocationHandler,实现它的invoke方法,至于为啥是这样俺也不知道了,^_^。另外,当我们产生一个代理实例(proxy instance)的时候,只要我们通过这个实例调用任何方法,都会导致invoke方法的调用,还是看例子吧,如下所示:

package cn.edu.hust.cm.test;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

 

public class Secretary implements InvocationHandler {

       public Secretary(Director director) {

              this.director=director;

       }

       public Object invoke(Object arg0, Method arg1, Object[] arg2)

                     throws Throwable {

        director.treat();

              System.out.println("由秘书结帐咯!");

              return null;

       }

       private Director director;

}

现在我们开始构建我们的主体测试代码,如下面的代码所示:

package cn.edu.hust.cm.test;

 

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Proxy;

 

public class ProxyTest extends Proxy {

 

       public ProxyTest(InvocationHandler arg0) {

              super(arg0);

       }

       public static void main(String[] args) {

              Director director=new Director();

              InvocationHandler secretary=new Secretary(director);

              Merchant merchant=(Merchant)Proxy.newProxyInstance(director.getClass().getClassLoader(),director.getClass().getInterfaces(),secretary);

              merchant.treat();

       }

 

}

运行程序,输出将为:董事长请客

由秘书结帐咯!

这里有几个要说明的地方,如下所述:

1.Proxy.newProxyInstance方法的作用,它的作用为某个对象创建一个代理对象,本例中是为director创建了一个代理对象,这个对象属于哪个类呢?我们在程序里面加这样一句System.out.println(merchant.getClass().getName()),输出是$Proxy0,呵呵,说明已经产生了一个代理类了,这个类实现了director所属类中的所有接口。

2.代理的实现机制问题。个人觉得这个似乎就是一个事件处理的机制,当代理对象调用某个方法的时候,就会触发相应的invoke方法。因此Proxy.newProxyInstance方法的第三个参数就相当于给这个代理对象注册了一个监听器。

Proxy类还有几个方法,用法可以查看相应的API文档。
 

分享到:
评论

相关推荐

    Java 静态代理模式

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

    Java代理模式Java动态代理

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

    java中的三种代理模式

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

    java实现代理模式

    用java实现代理模式,使用房屋中介的现实例子进行代理模式的说明

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

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

    Java中的代理模式Demo

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

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

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

    JAVA设计模式(代理模式)

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

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

    在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在...在实际开发中,应根据项目需求选择合适的代理模式。

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

    在虚拟代理模式中,主要包括以下三个核心组成部分: 1. **Subject**(主题):这是接口或者抽象类,定义了真实对象和代理对象共同的行为。 2. **RealSubject**(真实主题):实现了Subject接口或者继承自Subject...

    java代理模式

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

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

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

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

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

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

    在代理模式中,代理类作为真实对象的代表,可以在客户端和目标对象之间起到中介作用,例如,可以添加额外的功能,如缓存、日志记录、权限控制等,同时保持原有接口不变。 3. **迭代器模式**:迭代器模式是行为型...

    Java Spring代理模式AOP-IOC分析

    Java Spring代理模式AOP-IOC分析 一、代理模式概述 在软件设计中,代理模式是一种常用的设计模式。它可以在不修改原始代码的情况下,扩展或修改原始对象的行为。代理模式可以分为静态代理和动态代理两种。静态代理...

    Java中三种代理模式源码+文档

    在Java编程中,代理模式是一种常用的面向对象设计模式,它允许我们为一个对象提供一个代理以控制对该对象的访问。代理模式通常用于增加额外的功能、延迟加载、安全控制或者为远程对象提供本地接口等场景。这里我们将...

    java装饰模式及动态代理模式示例源码

    装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...

    Java两种代理模式案例

    总结来说,代理模式是设计模式中的重要组成部分,Java中的静态代理和动态代理各有优缺点。静态代理适用于简单场景,但维护成本较高;动态代理则更灵活,适用于需要动态增强功能的复杂系统。在实际开发中,应根据项目...

    代理模式java代码 Proxy(4)

    4. `ImageA.java`:这可能是一个处理图像的类,可能是代理模式中的目标对象,也可能是在代理类中被代理的对象。 5. `PageProxy.java`:这可能是一个页面代理类,用于处理与页面相关的操作,可能是为了添加额外的...

Global site tag (gtag.js) - Google Analytics