常用设计模式之代理(动态代理)

常用设计模式之代理(动态代理)

  • UML

  • Code1

 1 interface Subject{void doSth();}
 2 class RealSubject implements Subject{
 3     public void doSth(){
 4         System.out.println("RealSubject doSth....");
 5     }
 6 }
 7 class ProxyHandler implements InvocationHandler
 8 {
 9     private Object obj;
10     public ProxyHandler(Object obj){ this.obj = obj; }
11     //private Subject subject;
12     //public ProxyHandler(Subject subject){this.subject = subject;}
13     public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException
14     {
15         System.out.println(proxy.getClass().getName());
16         System.out.println("before -----------");
17         Object result = method.invoke(this.obj, args);
18         System.out.println("after -----------");
19         return result;
20     }
21 }
22 public class Test{
23     public static void main(String[] args){
24         Subject proxy = (Subject)Proxy.newProxyInstance(
25                 Subject.class.getClassLoader(),
26                 new Class[]{ Subject.class },
27                 new ProxyHandler(new RealSubject()));
28         proxy.doSth();
29         System.out.println(proxy.getClass().getName());
30     }
31 }
32 /*out:
33 com.wrb.$Proxy0
34 before -----------
35 RealSubject doSth....
36 after -----------
37 com.wrb.$Proxy0
38 */
  • Code2

 1 interface UserService {
 2     void add();
 3 }
 4 class UserServiceImpl implements UserService {
 5     public void add() {
 6         System.out.println("add");
 7     }
 8 }
 9 /**
10  * 实现自己的InvocationHandler
11  */
12 class MyInvocationHandler implements InvocationHandler {
13
14     // 目标对象
15     private Object target;
16
17     /**
18      * 构造方法
19      * @param target 目标对象
20      */
21     public MyInvocationHandler(Object target) {
22         super();
23         this.target = target;
24     }
25
26     /**
27      * 执行目标对象的方法
28      */
29     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
30         System.out.println("before------------------");
31
32         Object result = method.invoke(target, args);
33
34         System.out.println("after------------------");
35         return result;
36     }
37
38     /**
39      * 获取目标对象的代理对象
40      * @return代理对象
41      */
42     public Object getProxy() {
43         return Proxy.newProxyInstance(
44                 Thread.currentThread().getContextClassLoader(),
45                 target.getClass().getInterfaces(),
46                 this);
47     }
48 }
49 public class Test{
50     public static void main(String[] args){
51         MyInvocationHandler handler =
52                             new MyInvocationHandler(new UserServiceImpl());
53         UserService proxy = (UserService) handler.getProxy();
54         proxy.add();
55     }
56 }
57 /*out:
58 before------------------
59 add
60 after------------------
61 */
  • 实现原理

Proxy.newProxyInstance() 返回的代理对象subjectProxy(全都继承了父类Proxy)实现了其第二个参数中的全部接口,且包含了其第三个参数中的处理器对象handler。无论调用subjectProxy的哪个方法,实际都被转为调用处理器对象的invoke()方法。

class SubjectProxy extends Proxy implements Asubject, Bsubject, Csubject{

    private InvocationHandler myHandler;

    public  **( * ) {

       subjectProxy.myHandler.invoke(this, method, args);

    }

}

因为subjectProxy已经继承了父类Proxy,加上java单继承,因此此法只能实现接口的动态代理,无法实现类的动态代理。想实现类的动态代理,可以使用CGLIB(Code Generation Library)。(目前为止已接触三种代理的实现:装饰者模式实现的代理(decorator),JDK 动态代理(dynamic proxy) 和 Cglib 动态代理 (cglib proxy))。

参考:

JDK1.8 源码,

http://blog.csdn.net/jiankunking/article/details/52143504

http://rejoy.iteye.com/blog/1627405

http://www.360doc.com/content/14/0801/14/1073512_398598312.shtml

时间: 2024-08-24 21:20:43

常用设计模式之代理(动态代理)的相关文章

代理模式(静态代理+动态代理)——JAVA

代理模式是常用的java设计模式,他的特征是代理类与目标类有同样的接口,代理类主要负责为目标类预处理消息.过滤消息.把消息转发给目标类,以及事后处理消息等.代理类与目标类之间通常会存在关联关系,一个代理类的对象与一个目标类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用目标类的对象的相关方法,来提供特定的服务. 结构图如下: 按照代理的创建时期,代理类可以分为静态代理和动态代理. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类(Proxy)的.clas

【SSH系列】静态代理&&动态代理

从设计模式说起 代理模式是二十三中设计模式中的一种,代理模式就是指由一个代理主题来操作真实的主题,真实的主题执行具体的业务操作,而代理主题负责其她相关业务,简而言之,代理模式可以由以下三个部分组成: a.抽象角色:通过接口或抽象类声明真实角色实现的业务方法. b.代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作. c.真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用.第一次接触代理模式的是在学习大话设计模式的时候,首先

spring 代理(静态代理&动态代理&cglib代理)

介绍spring AOP之前 先介绍三种常见的代理方式:静态代理,动态代理,cglib代理 代理概述: 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式:即通过代理访问目标对象.这样好处: 可以在目标对象实现的基础上,增强额外的功能操作.(扩展目标对象的功能). 举例:明星(邓紫棋)<------经纪人<-------用户 目标        (代理) 一.静态代理 1)代理的对象要实现与目标对象一样的接口 2)举例:保存用户(模拟) Dao,直接保存 DaoProxy,给保存

设计模式之Jdk动态代理

什么是动态代理呢?就是在java的运行过程中,动态的生成的代理类.(为了更熟悉的了解动态代理,你必须先熟悉代理模式,可点击设计模式之代理模式 阅读)我们知道java属于解释型语言,是在运行过程中,寻找字节码文件从而实现类加载的.但是字节码文件并不需要一定是硬盘中的class文件,也可以是来自网络.数据库或者是直接生成的数据流.因此这就给虚拟机动态的生成代理类提供了可能.Java 1.3 正式引入,动态代理(Dynamic proxies)特性.前一篇文章我们已经知道Proxy是代理模式的核心,而

设计模式-代理/动态代理

最近一段时间在看spring的源码,发现里面大量的使用的代理.代理:就是用代理类实现委托类的一些功能和附加的预处理功能(包括消息过滤,日志等).代理(proxy)模式:指目标对象给定代理对象,并由代理对象代替真实对象控制客户端对真 实对象的访问, java的代理分为静态代理和动态代理,java 对动态代理有很好的支持,提供了 InvocationHandler接口和 Proxy 类. 1.动态代理和静态代理的区别 静态代理,代理类要实现被代理接口的所有的方法.  动态代理是利用java反射机制,

Java代理/静态代理/动态代理/代理模式

代理模式:即Proxy Pattern,常用的设计模式之一.代理模式的主要作用是为其他对象提供一种代理以控制对这个对象的访问. 代理概念 :为某个对象提供一个代理,以控制对这个对象的访问. 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代.代理类负责请求的预处理.过滤.将请求分派给委托类处理.以及委托类执行完请求后的后续处理. 下面以明星为例模拟需求说明静态代理和动态代理. 一.首先看静态代理 看下图:歌迷希望明星许巍唱歌(许巍即是目标对象),但不可能直接找

啰里吧嗦式讲解java静态代理动态代理模式

一.为啥写这个 文章写的比较啰嗦,有些东西可以不看,因为想看懂框架, 想了解SSH或者SSM框架的设计原理和设计思路, 又去重新看了一遍反射和注解, 然后看别人的博客说想要看懂框架得先看懂设计模式,于是遇到了动态代理这个大坑, 写博客等于是对自己学习过程的一个回顾和总结 本文主要参考欧阳锋的10分钟看懂动态代理设计模式 二.理解和弄懂代理的前期准备 2.1.什么是代理 简单来说就是有活不自己干,让别人干, 比如你不想写作业, 让同学帮你写,然后写上自己的名字, 这个同学就是你的代理, 帮你处理一

静态代理$动态代理

什么是静态代理? 静态代理就是代理模式,给真实类做了个增强的方法 比如你有个房源,你还有代理人那么这个代理人就会给你的怎是房源的基础上,夸大点让你的房源增加人脉... 就要用到增强方法,就在代理类中给你的方法增强 //静态代理模式public class Progects {/* @Test public void dd() {//真实代理 Subject jk=new Real(); //代理对象 Proxy hj=new Proxy(); //调度代理对象(jk)方法增强 hj.setSub

软件开发常用设计模式—iOS 中的代理模式总结

比如现在有一个人,想要买一张电影票,但是她很忙碌,没时间去买,那怎么办呢?只能说委托给另一个人去买. 此时,需要 person 给 other 发送消息,通知 other 去给她买电影票,而 other 也要反馈消息给 person,此时 other 就是一个代理人,person 委托代理人去办事情(买票).代理人是给委托人代办一些事情的人.具体代理人怎么做的这些事情,委托人不管,委托人只看反馈. 先看代理设计模式的基本原理 #import <Foundation/Foundation.h>

iOS常用设计模式和机制之代理

Delegate : 1 代理设计模式的使用我们首先需要明白三个要素 *委托方:委托别人去执行某些操作的人(对象) *代理方:被委托区执行某些操作的人(对象) *协议:(protocol)委托方需要代理方执行的操作 > 协议是一套标准(一堆方法的声明),只有 .h 文件.协议的定义以 @protocol 开始,以 @end 结束. > 协议中的方法默认是必须实现的,@required .关键字 @optional 修饰的方法是可选的,课实现也可不实现. 2 delegate 的设计步骤 步骤1