Java代理设计模式详解

原创 2016年06月01日 14:40:51

代理即通过代理类,找到适合你的实现类。相当于现实生活中的中介的角色,你想租房子,这个时候你又不想自己找房子,那你可以找中介,通过中介找到合适自己的房子,同时你也可以让中介帮你签合同等其他事宜。代理存在静态代理和动态代理两种

静态代理

public interface Sourceable {  
    public void method();  
}  
public class Source implements Sourceable {  

    @Override  
    public void method() {  
        System.out.println("the original method!");  
    }  
}  
public class Proxy implements Sourceable {  

    private Source source;  
    public Proxy(){  
        super();  
        this.source = new Source();  
    }  
    @Override  
    public void method() {  
      //新增的处理,个性化处理
        before();  
        source.method();  
        atfer();  
    }  
    private void atfer() {  
        System.out.println("after proxy!");  
    }  
    private void before() {  
        System.out.println("before proxy!");  
    }  
}  

测试类

public class ProxyTest {  

    public static void main(String[] args) {  
        Sourceable source = new Proxy();  
        source.method();  
    }  

}  

动态代理

JDK动态代理、AOP动态代理

Proxy提供了用于创建动态代理类和代理对象的静态方法,它也是所有动态代理类的父类

创建动态代理类

static Class

public interface Colorable {
     public void value();
}
public class RedColor implements Colorable{
     @Override
        public void value() {
            System.out.println("--------------red-------------");
        }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ColorableProxy implements InvocationHandler {

    private Colorable colorable;
    private Colorable proxy;

    public ColorableProxy(Colorable colorable) {
        this.colorable = colorable;
        this.proxy = (Colorable) Proxy.newProxyInstance(
                Colorable.class.getClassLoader(),
                new Class<?>[] { Colorable.class }, this);
    }

    public Colorable getProxy() {
        return proxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        String methodName = method.getName();

        System.out.println("===========starting invoke function:" + methodName
                + "==========");

        Object result = method.invoke(colorable, args);

        System.out.println("=========== invoke function:" + methodName
                + " success==========");
        return result;
    }

    public static void main(String[] args) {

        Colorable proxy = new ColorableProxy(new RedColor()).getProxy();
        //真正调用invoke方法是在这一步才被激发的,可以debug试一下
        proxy.value();
    }

}

结果

===========starting invoke function:value==========
--------------red-------------
=========== invoke function:value success==========

proxy:代表动态代理对象

method:代表正在执行的方法

args:代表调用目标方法时传入的实参

AOP动态代理

这里写图片描述

public interface Colorable {
     public void value();
}
public class RedColor implements Colorable{
     @Override
        public void value() {
            System.out.println("--------------red-------------");
        }
}
public class ToolUtility {

    public void method(){
        System.out.println("运行工具方法");
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ColorableAOProxy implements InvocationHandler {
    private Colorable colorable;
    private Colorable proxy;

    public ColorableAOProxy(Colorable colorable) {
        this.colorable = colorable;
        this.proxy = (Colorable) Proxy.newProxyInstance(
                Colorable.class.getClassLoader(),
                new Class<?>[] { Colorable.class }, this);
    }

    public Colorable getProxy() {
        return proxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        ToolUtility tool = new ToolUtility();
        tool.method();
        String methodName = method.getName();
        System.out.println("===========starting invoke function:" + methodName
                + "==========");
        Object result = method.invoke(colorable, args);

        System.out.println("=========== invoke function:" + methodName
                + " success==========");
        return result;
    }

    public static void main(String[] args) {
        Colorable proxy = new ColorableAOProxy(new RedColor()).getProxy();
        // 真正调用invoke方法是在这一步才被激发的,可以debug试一下
        proxy.value();
    }
}

结果

运行工具方法
===========starting invoke function:value==========
--------------red-------------
=========== invoke function:value success==========

更多内容可以关注微信公众号,或者访问AppZone网站

http://7xp64w.com1.z0.glb.clouddn.com/qrcode_for_gh_3e33976a25c9_258.jpg

相关文章推荐

Java设计模式(四)代理模式详解

在实际开发过程中,我们常遇需要到为一个对象在不同的地址空间创建局部代理的情况,比如说一个Web服务器可能被不同的应用使用,我们就需要在每一个应用下都创建一个WEB服务器的局部引用。又或者在创建一些开销...

Java开发中的23种设计模式详解----代理模式(Proxy)

其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你...
  • sjyttkl
  • sjyttkl
  • 2017年06月19日 17:36
  • 197

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

其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替源对象进行一些操作,比如我们在租房子的时候会去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望一个更熟悉的人去帮你做...

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

  • 2017年07月09日 12:54
  • 26KB
  • 下载

15. JAVA 反射机制 Part 2(动态代理、类的生命周期、工厂设计模式) ----- 学习笔记

 15.5 动态代理 15.6 类的生命周期 15.7 工厂设计模式         15.7.1 将反射应用在工厂模式上        ...

Java设计模式之代理模式

  • 2014年01月22日 11:09
  • 51KB
  • 下载

Java设计模式-代理模式

  • 2015年01月25日 01:27
  • 10KB
  • 下载

Java设计模式之----动态代理(二)

一、动态代理理论       动态代理类是在程序运行期间,由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件(相当于jvm替 我们实现一个代理类)。代理类和委托类的关系是在程序运行时确...

java 设计模式 动态代理

动态代理的工作是: 在一段程序的外面在包上一段其他程序,这样就会比较方便 这里要注意,是指的是在仅仅是方法外层包上一层其他方法,而不是抱在jdk把方法实例化后再包上其他方法 如果实例化后,这里会...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java代理设计模式详解
举报原因:
原因补充:

(最多只允许输入30个字)