乐趣区

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

代理模式:为其余对象提供一种代理以管制对这个代理对象的拜访

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

代理模式中有三个角色:

形象角色:申明实在对象和代理对象的独特接口。

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

实在角色:它代表着实在对象。是咱们终于要援用的对象

动态代理

模仿场景:

生存中咱们在大城市租房,很多都是中介给介绍的或者二房东,从中介手里能够租到房东的房子,从房东手里也能够租到房子,中介、二房东只是代理房东租房,他们都有一个独特的租房接口。

租房接口:

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 一起吹水聊天

当初还是从房东那租房子,只是两头多了一层关系。代理类外面还能够加其余性能,配客户看房吃饭等。

就是在不扭转原有代码的根底上,对原有的代码进行加强,所以才有代理类。

长处:

  • 肯定水平上升高了零碎的耦合度,扩展性好。
  • 公共角色交给代理,实现业务的分工
  • 对指标对象的性能加强

毛病:

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

动静代理

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

动静代理分为两大类:接口动静代理 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,疾速升职加薪,走上人生巅峰。

能够的话请给我一个三连反对一下我哟??????【白嫖材料】

退出移动版