设计模式(二) 动态代理

1.1、动态代理

      在程序运行时,运用反射机制在内存中动态创建代理对象,其实现的功能是与静态代理的功能是类似的,都是增强目标对象额外的功能操作,扩展目标对象。只不过是实现的方法不一致而已。

1.2、动态代理实现的要求

      1)代理对象,不需要实现与目标一样的接口;

      2)代理对象的生成,是利用JDKAPI, 动态的在内存中构建代理对象(需要我们指定创建 代理对象/目标对象 实现的接口的类型);

      3)  动态代理, JDK代理或者接口代理;

      JDK中生成代理对象的API:Proxy

              static Object newProxyInstance(

               ClassLoader loader,        指定当前目标对象使用类加载器(一般使用默认)

              Class<?>[] interfaces,     目标对象实现的接口的类型

              InvocationHandler h         事件处理器(在此添加对目标对象实现功能的扩展)

            )

代码实现如下:

 新建一个接口:IUserDao

public interface IUserDao { //接口对象

    public void save();//保存用户
}
 目标对象:UserDao
public class UserDao implements IUserDao { //目标对象
    @Override
    public void save() {
        System.out.println("保存用户");
    }
}

工厂代理对象:ProxyFactory  可以实现对所有类的代理。

public class ProxyFactory {

    private Objects target;

    public ProxyFactory(Objects target) {
        this.target = target;
    }

    //  给目标对象返回代理对象
    public Object getProxyInstance(){
       return Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args)
                            throws Throwable {
                        System.out.println("日志打印---开始---");
                        Object roxyObject =  method.invoke(target,args);
                        System.out.println("日志打印---结束---");
                        return roxyObject;
                    }
                });

    }
}

结果:


动态代理总结:


    代理对象不需要实现接口,但是目标对象一定要实现接口;否则不能用动态代理!


思考:


        有一个目标对象,想要功能扩展,但目标对象没有实现接口,怎样功能扩展?

 
				
时间: 2024-08-26 00:56:14

设计模式(二) 动态代理的相关文章

设计模式之动态代理模式

设计模式之动态代理模式 代理模式: Provide a surrogate or placeholder for another object to controlaccess to it(为其他对象提供一种代理以控制对这个对象的访问).使用代理模式创建代理对象,让代理对象控制目标对象的访问(目标对象可以是远程的对象.创建开销 大的对象或需要安全控制的对象),并且可以在不改变目标对象的情况下添加一些额外的功能. 代理模式相关内容详见本人之前文章:http://www.cnblogs.com/zh

深入解析Java设计模式之动态代理

深入解析Java设计模式之动态代理 代理是基本的设计模式之一,它是你为了提供额外的或不同的操作,而插入的用来代替"实际"对象的对象.这些操作通常涉及与"实际"对象的通信,因此代理通常充当着中间人的角色,下面是一个用来展示动态代理结构的简单示例: /** 普通(非动态)代理示例: */ interface Interface { void doSomething(); void somethingElse(String arg); } class RealObject

浅谈-Java设计模式之动态代理

动态代理模式(Dynamic Proxy Pattern): 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的. 首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的: InvocationHandler该接口唯一方法 invoke(Object proxy, Method method, Object[] args) Object

Java设计模式—Proxy动态代理模式

代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代理模式 为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别.通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性.Java 动态代理机制以巧妙的方式近乎完

JAVA设计模式之动态代理

代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别.通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性.Java 动态代理机制以巧妙的方式近乎完美地实践了代理模式的

二十二 动态代理&amp;解决网站的字符集编码问题

设计模式: 软件开发过程中,遇到相似问题,将问题的解决方式抽取模型(套路) 单例,工厂,装饰者,适配器,动态代理 谷歌汽车场景: 谷歌汽车场景Car 设计了汽车开发阅读 Interface Icar{  start  run  stop} final class GoogleCar implments ICar(){} 希望将谷歌Car接入到生态圈 装饰者设计模式 场景:二次开发的时候,无法获取源码GoogleCar,无法使用继承的情况下,要对已经存在的对象进行增强 前提:可以获取到被装饰的对象

设计模式之动态代理

一.动态代理概念 动态代理分为JDK动态代理和cglib动态代理两种方式. jdk动态代理是由Java内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的. 总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题). 还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口.如果没有上述前提,jdk动态代理不能应用. 由此可以看出,jdk动态代理有一定的局限性,cg

设计模式之动态代理模式实战

动态代理在我们工作当中应用相当广泛,如Srping AOP就是动态代理的在开源框架的比较出名的应用.动态代理有两种试:一是通过JDK自带的API实现动态代理,二是通过别的字节码框架实现,如cglib.需要注意的是JDK只能针对接口实现动态代理,不能代理普通类,使用具有局限性.而cglib可以代理接口及所有的普通类. 用户接口 public interface UserInterface { boolean saveUser(User user); } 用户接口实现 public class Us

老王讲自制RPC框架.(二.动态代理)

(#简介) 什么是动态代理?动态代理是实现阶段不关心代理是谁,而在运行阶段才指定代理对象是哪一个,动态代理在做框架方面使用非常 广泛,比如spring的aop,其核心就是采用动态代理机制,下面让我们来看看如何实现一个动态代理模式 (#实现) 首先我们来定义一个接口 public interface ICar { void run(String name); } 然后我们来定义一个实现类 public class Car implements ICar { public void run(Stri

设计模式之动态代理(Java的JDK动态代理实现)

对于JDK的动态代理,孔浩老师说学习的方法是把它记下来. 先写一个主题接口类,表示要完成的一个主题. package com.liwei.dynaproxy; /** * 要代理的主题接口 * @author Administrator * */ public interface Subject { public void miai(); } 再写一个实现类,这个实现类实现这个接口.当然,这个实现类就是我们要代理的对象. 为了区别不同的类的对象,我们为Person类增加了一个name属性,并且通