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设计模式之代理

摘要:本篇笔记是对Java中很难理解的设计模式——代理模式的学习记录、包括由问题引出代理模式的出现、包括静态代理、和核心的动态代理。至于为什么从最难理解的开始、则是想给自己传达个信念:万事开头难!那就...
  • chenghuaying
  • chenghuaying
  • 2014年03月11日 12:08
  • 2572

Java设计模式-代理模式之动态代理(附源码分析)

Java设计模式-代理模式之动态代理(附源码分析) 动态代理概念及类图 上一篇中介绍了静态代理,动态代理跟静态代理一个最大的区别就是:动态代理是在运行时刻动态的创建出代理类及其对...
  • yujin753
  • yujin753
  • 2015年06月26日 17:37
  • 2254

Java设计模式之代理模式(基础篇)

代理模式就是为其他对象提供一种代理以控制对这个对象的访问的模式。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。换言之,就是在一些情况下,一个...
  • wchycsdn
  • wchycsdn
  • 2016年09月03日 19:18
  • 332

【设计模式】代理模式详解

前言 博主只是一名大三学生,文章内容难免有不足之处,欢迎批评指正。   正文 转载请注明出处: http://blog.csdn.net/h28496/article/details/46707621...
  • H28496
  • H28496
  • 2015年07月01日 10:45
  • 1379

JAVA设计模式之代理模式

【代理模式应用场景举例】 比如在玩“极品飞车”这款游戏,如果游戏者手中的金钱达到了一定的数量就可以到车店买一部性能更高的赛车,那么这个卖车的“车店”就是一个典型的“汽车厂家”的“代理”,他为汽车厂家...
  • jason0539
  • jason0539
  • 2014年04月05日 07:07
  • 23452

浅析JAVA设计模式之代理模式(二)

1 动态代理          在上一篇文章《浅析JAVA设计模式之代理模式(一)》中,已经简单介绍了代理模式的定义,以及分析和实现了静态代理类,接下来我们分析动态代理。     动态代理类:...
  • minidrupal
  • minidrupal
  • 2014年05月02日 22:14
  • 1614

java代理设计模式

/* 代理模式,顾名思义就是委托别人去做事情。 在cocoa touch框架中的Delegate,委托人往往是框架中的对象(视图中的控件、tableView等),代理人往往是视图控制器对象。 代理人首...
  • qianlima210210
  • qianlima210210
  • 2016年05月19日 16:34
  • 229

代理设计模式_JAVA

前言:   之前在学习JAVA基础的时候就知道有代理设计模式。不过,那个时候只是简单地学习了一下静态代理模式。今天在学习DAO设计模式时候,用到了工厂设计模式和代理设计模式。所以,就索性系统点的记录一...
  • online_onlie
  • online_onlie
  • 2016年10月22日 19:58
  • 353

JAVA设计模式之----------代理模式(Proxy)

这里只是简单的介绍下最基本的代理的使用。 代理,通俗点说 :就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和...
  • yangxin_blog
  • yangxin_blog
  • 2015年12月15日 09:11
  • 1216

java 代理设计模式

什么是代理 代理:代理模式是常用的Java 设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 静态代理: ...
  • wqb1319856391
  • wqb1319856391
  • 2015年10月23日 12:17
  • 190
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java代理设计模式详解
举报原因:
原因补充:

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