java代理设计模式

来源:互联网 发布:工信部大数据认证 编辑:程序博客网 时间:2024/06/06 20:07

       代理设计模式分为两种,一种为动态代理,另外一种为静态代理。其中动态代理应用的比较广泛,如spring的AOP(面向切面编程)等等。。。下面简单的来介绍下这种模式的区别:

     1. 静态代理:

       在代理类中手动提供所有需要被代理的对象
       优点:  -->可以在执行功能前后添加额外功能,增加了程序的可扩展性
                  -->无法直接获取到所代理类,增加了被代理类的安全性

       缺点:  -->运行效率上降低 

                  -->无法直接获取到被代理的类,增加了复杂性

public class FangDong {public void chuzufang(){System.out.println("我要出租一个一室一厅的房子");}}

动态代理:由Proxy动态代理所需要代理的对象,由运行时指定。

提供InvocationHandler接口的实现类(调用接口,执行每个被代理对象的方法时,执行InvocationHandler中invoke方法)

public class ZhongJie implements InvocationHandler{

    //被代理对象

    private Object obj;

    public ZhongJie(Object obj){

        this.obj = obj;

    }

    /**

     * proxy:代理对象,新产生的代理对象

     * method:所代理的方法

     * args:代理方法的参数

     *

     * 返回值:Object,返回原方法的返回内容。

     */

    public Object invoke(Object proxy, Method method, Object[] args)

            throws Throwable {

        System.out.println("收取房东中介费");

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

        System.out.println("收取个人中介费");

        return result;

    }

 

}

要求被代理对象,必须提供对应接口

public interface FangDongDao {

    void chuzufang();

}

public class FangDong implements FangDongDao{

    public void chuzufang(){

        System.out.println("我要出租一个一室一厅的房子");

    }

}

加载对应的内容

ClassLoader:类加载器,负责加载类,然后才能实例化

Class:类类型

public class Mine {

    public static void main(String[] args) {

        //1.Invocationhandler对象

        InvocationHandler handler = new ZhongJie(new FangDong());

        //2.产生被代理对象

        FangDongDao fangdong  = (FangDongDao) Proxy.newProxyInstance(FangDongDao.class.getClassLoader(), new Class[]{FangDongDao.class}, handler);

        fangdong.chuzufang();

    }

}




原创粉丝点击