面试阿里被问到Java设计模式之代理模式,我不想多说,直接给她整的明明白白!!!

柯里星轨
• 阅读 787

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

代理分为两种模式:静态代理、和动态代理模式

代理模式中有三个角色:

抽象角色:声明真实对象和代理对象的共同接口。

代理角色:代理对象与真实对象实现同样的接口,所以它可以在不论什么时刻都可以代理真实对象。代理角色内部包括有对真实对象的引用。所以她可以操作真实对象,同一时候也可以附加其它的操作,相当于对真实对象进行封装。

真实角色:它代表着真实对象。是我们终于要引用的对象

静态代理

模拟场景:

生活中我们在大城市租房,很多都是中介给介绍的或者二房东,从中介手里可以租到房东的房子,从房东手里也可以租到房子,中介、二房东只是代理房东租房,他们都有一个共同的租房接口。

租房接口:

public interface IRent {
    void Rent();//出租
}

房东出租房子(真实角色):

public class Host implements  IRent{
    @Override
    public void Rent() {
        System.out.println("房东出租房");
    }
}

增加一个代理类(代理角色),实现租房的接口

public class Proxy implements  IRent{
    private Host host;
    public  Proxy(Host host)
    {
        this.host=host;
    }
    @Override
    public void Rent() {
       host.Rent();
    }
}
public static void main(String[] args) {
    Host host=new Host();
    Proxy proxy=new Proxy(host);
    proxy.Rent();
}//加入Java开发交流君样:593142328一起吹水聊天

面试阿里被问到Java设计模式之代理模式,我不想多说,直接给她整的明明白白!!!

现在还是从房东那租房子,只是中间多了一层关系。代理类里面还可以加其他功能,配客户看房吃饭等。

就是在不改变原有代码的基础上,对原有的代码进行增强,所以才有代理类。

优点:

  • 一定程度上降低了系统的耦合度,扩展性好。
  • 公共角色交给代理,实现业务的分工
  • 对目标对象的功能增强

缺点:

如果要实现多个代理的话,一个真实角色就会产生一个代理角色,开发代码量翻倍

动态代理

动态代理和静态代理原理一样,不过动态代理的代理类是自动生成的,不是是手动编写的

动态代理分为两大类:接口动态代理JDK、类的动态代理cglib、java字节码

实现JDK动态代理的步骤:

JDK动态代理中包含一个类和一个接口:

Proxy类

Object Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler)
  • loader:代理类的入口(当前类的类加载器)
  • interfaces:被代理的接口
  • handler:InvocationHandler接口

InvocationHandler接口

public interface InvocationHandler { 
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable; 
} 
  • proxy - 调用该方法的代理实例
  • method - 对应于在代理实例上调用的接口方法的方法实例。
  • args - 包含代理实例上方法调用中传递的参数值的对象数组。

步骤一:新建一个类,实现代理调用的接口InvocationHandler,并重写里面的invoke方法执行动作

public class ProxyInvocationHandler implements InvocationHandler {
    //被代理的接口
    private  Object object;

    //传入被代理的接口
    public  ProxyInvocationHandler(Object object)
    {
        this.object = object;
    }

    //处理代理实例 并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
       Object result =method.invoke(object,args);//执行接口  args:接口上的方法
        return result;
    }
}

步骤二:生成代理类Proxy

//创建代理对象
IRent obj=(IRent) Proxy.newProxyInstance(IRent.class.getClassLoader(), new Class<?>[]{IRent.class}, pih);

步骤三:测试

   public static void main(String[] args) {
        //真实对象
        Host host=new Host();
        //代理对象的调用处理程序 并设置要代理的对象
        ProxyInvocationHandler pih=new ProxyInvocationHandler(host);
        //动态生成代理类
        IRent obj=(IRent) Proxy.newProxyInstance(IRent.class.getClassLoader(), new Class<?>[]{IRent.class}, pih);
        obj.Rent();//加入Java开发交流君样:593142328一起吹水聊天
    }

动态代理的好处

静态代理有的它都有,静态代理没有的,它也有!

  • 可以使得我们的真实角色更加纯粹 . 不再去关注一些公共的事情
  • 公共的业务由代理来完成 . 实现了业务的分工
  • 公共业务发生扩展时变得更加集中和方便
  • 一个动态代理 , 一般代理某一类业务
  • 一个动态代理可以代理多个类,代理的是接口

最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。

可以的话请给我一个三连支持一下我哟??????【白嫖资料】

面试阿里被问到Java设计模式之代理模式,我不想多说,直接给她整的明明白白!!!

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
java模式之一
代理模式的概念:对其他对象提供一种代理以控制对这个对象的访问代理模式的三种实现(1)静态代理静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类.eg publicinterfacePammerDao{   voiddomain();}publicTargetimpl
Wesley13 Wesley13
4年前
java的动态代理
1\.什么是动态代理代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色。Java的动态代理比代理的思想更前进了一步,它可以动态地创建并代理并动态地处理对所代理方法的调用。在动态代理上所做的所有调用都会被重定向到单一的调用处理器上,它的工作是揭示调用的类型并确定相
Wesley13 Wesley13
4年前
java技术学习路线(自用)
一:常见模式与工具    1.常用设计模式:                 1.1.Proxy代理模式:指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。详见https://www.cnblogs.com/qifengshi/p/6566752.html       
Easter79 Easter79
4年前
Spring的两种代理JDK和CGLIB的区别浅谈
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Easter79 Easter79
4年前
Spring的两种动态代理:Jdk和Cglib 的区别和实现
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Wesley13 Wesley13
4年前
JDK动态代理的简单实现
1\.先理一下动态代理实现的思路:    实现功能:自己定义一个类Proxy,通过Proxy的静态方法newProxyInstance(Class<Tintface,InvocationHandlerh)返回代理对象, intface:被代理类的接口对象, h:InvocationHandler的实例对象    1).声明一段动
Wesley13 Wesley13
4年前
Java中jdk代理和cglib代理
代理模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。在Java中代理模式从实现方式上可以分为两个类别:静态代理和动态代理静态代理:也就是我们学习设计模式之代理模式时常见的事例,具体不在赘述,参见:
Wesley13 Wesley13
4年前
JDK动态代理
一,什么是代理?代理:本来是自己应该做的事,却请了别人来做,被请的人就是代理对象举例:春节回家买票找人代买,黄牛就是代理对象二,什么是动态代理?代理的对象是变动的,在程序运行过程中产生的.而在程序运行过程中产生对象,这个对象是不固定的,那么可以通过反射来实现,所以动态代理是基于反射实现的.
Wesley13 Wesley13
4年前
Java代理模式的实现方式
代理模式是23种设计模式之一,定义为:为其他对象提供一种代理以控制对这个对象的访问。简单来说就是在调用方无感知的情况下,修改原有的行为。\TOC\静态代理即通过手动编码方式实现publicinterfaceIFooService{voidfoo();}publicclass
待兔 待兔
1年前
Java设计模式之 - 代理模式
代理模式的介绍:代理模式也称为委托模式,在开发中经常用到,是编程的好帮手,在日常生活中也比较常见。比如公司中午让同事帮忙带一份饭,比如我们请一个律师打官司,比如我们用代理服务器上网等等。代理模式真是无处不在。代理模式的定义:为其它对象提供一种代理以控制对这