ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

代理模式

2021-11-21 19:01:53  阅读:113  来源: 互联网

标签:角色 Object 代理 模式 Rent public rent


1、代理模式

代理模式:为其他对象提供一种代理以控制这个对象的访问。

分析:

  • 抽象角色:一般使用接口或者抽象类来解决
  • 真实角色:被代理的角色
  • 代理角色:可以代理真实角色,拥有真实角色的方法
  • 客户:访问代理角色

image-20211121184813867

1.1 静态代理模式

静态代理是由程序或特定工具自动生成的源代码,在程序运行时,.class文件就已经存在了。

静态代理的好处:

  • 使真实角色的操作更加纯粹,代码不用动,不用去关注一些公共业务
  • 公共业务交给代理角色!实现业务的分工
  • 公共业务扩展也是再代理角色中实现,方便集中管理

真实角色类:

public interface Renti { 
    void rent();
}
public class Rent implements Renti{
    public void rent() {
        System.out.println("buy house!----真实对象");
    }
}

代理角色类:

public class RentProxy implements Renti{
    private Rent rent;

    public RentProxy(Rent rent) {
        this.rent = rent;
    }

    public void rent() {
        System.out.println("fiex!-----代理对象");
        rent.rent();
    }
}

测试类(客户):

//静态代理模式:
@Test
public static void main(String[] args) {
    Rent rent = new Rent();
    RentProxy rentproxy = new RentProxy(rent);
    rentproxy.rent();
}

1.2 动态代理模式

动态代理指在运行时自动生成的代理类。

动态代理的好处:

  • 使真实角色的操作更加纯粹,代码不用动,不用去关注一些公共业务
  • 公共业务交给代理角色!实现业务的分工
  • 公共业务扩展也是再代理角色中实现,方便集中管理
  • 一个动态代理类代理一个接口,一般是对应的一类业务
  • 一个动态代理类可以代理多个类,只要是实现同一个接口就可以

动态代理需要实现InvocationHandler接口的invoke方法:

  • 创建方法,必须调用Proxy类的静态方法newProxyInstance,该方法如下:

    Object Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) throws IllegalArgumentException

    • loder:表示类加载器,通过getClassLoader()获取
    • interfaces:表示需要代理的类的接口,通过getInterfaces获取
    • handler:表示调用处理器,实现了InvocationHandler接口的对象
  • 最后,在重载的invoke方法中,使用method.invoke()方法传参

实体类:

public interface Rent {
    void rent();
}
public class RentRel implements Rent{
    public void rent() {
        System.out.println("buy house!---真实主体!");
    }
}

代理类:

public class Proxydy implements InvocationHandler {
    //被代理的接口。
    private Object object = null;

    //生成得到的代理类。
    public Object newReal(Object real){
        this.object = real;
        Class<?> realClass = real.getClass();
        Object proxyInstance = 				Proxy.newProxyInstance(realClass.getClassLoader(),realClass.getInterfaces(),this);	
        return proxyInstance;
    }

    //处理代理实例,并返回结果。
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("进入代理!!!!");
        //本质:使用反射机制实现动态代理。
        Object invoke = method.invoke(object, args);
        return invoke;
    }
}

测设类:

//动态代理模式:
public static void main(String[] args) {
    Rent real = (Rent) new Proxydy().newReal(new RentRel());
    real.rent();
}

标签:角色,Object,代理,模式,Rent,public,rent
来源: https://www.cnblogs.com/vxzx/p/15585425.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有