zoukankan      html  css  js  c++  java
  • java23种设计模式之五:代理模式

    一.代理模式介绍

        代理模式的定义:就是为一个接口(对象)提供一个代理的对象,并由这个代理对象控制对原对象的访问流程

       其中代理又分为:静态代理和动态代理

          静态代理:指的是自己要写一个代理类,或者用工具生成一个代理类,总之就是程序运行之前已经存且编译好的代理类.(自己写的类)
         动态代理:指由JVM虚拟机程序运行时产生的代理类。(jvm或第三方生成的类)

      动态类具有更强的灵活性,它不用在我们设计实现类时指定哪个类被代理了。

    二.动态代理

      覆盖InvocationHandler接口中的invoke()方法,更重要的是,动态代理模式可以使得我们在不改变原来已有的代码结构的情况下,对原来的原有进行扩展、增强其功能,并且可以达到控制被代理对象的行为。

      每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。

    public class DynamicProxy implements InvocationHandler{
        
         // 被代理类的实例
        Object proxy;
        
        public DynamicProxy(Object proxy) {
            this.proxy = proxy;
        }
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
         if(proxy.class.equals(method.getDeclaringClass)){//如果调用的对象方法是从object类中继承来的,直接放行
           return method.invoke(this,args);
         }
    Object result
    = method.invoke(this.proxy, args); return null; } } public interface ProxySSSS { public void buyCar(int cash); } public class User implements ProxyInterface{ private int cash; //花费 private String name; public User(int cash,String name){ this.cash = cash; this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getCash() { return cash; } public void setCash(int cash) { this.cash = cash; } public void buyCar() { System.out.println("花 "+cash +"钱买车"); } }

    动态代理测试类

    public class MainTest {
        public static void main(String[] args) {
            User user = new User("张三",1000);
            InvocationHandler handler = new DynamicProxy(user);
            /**
             * 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:
             * Proxy.newProxyInstance 3个参数的意思:
             *            handler.getClass().getClassLoader() : 获取代理类的加载 器来加载动态代理类对象
             *         user.getClass().getInterfaces()        : 该对象的方法就是代理类所代理的方法
             *         handler                                : InvocationHandler 对象
             */
            ProxySSSS instance = (ProxySSSS)Proxy.newProxyInstance(
                                                handler.getClass().getClassLoader(), 
                                                user.getClass().getInterfaces(), 
                                                handler);
    
            instance.buyCar(user.getCash());
    
        }
    }

      

  • 相关阅读:
    《Geometric Deep Learning综述介绍》
    《和想象不太一样的'Graph Neural Network + Zero Shot'》
    《几何深度学习前沿》
    《【Paper Live】滴滴出行-探索资源约束的Contextual Bandits问题 & KDD Cup滴滴出行比赛解读>
    《PDP: 解决约束满足问题的神经网络架构 | 刘晶 | 集智俱乐部图网络论文读书会20190819》
    《NeuroSAT: Learning a SAT Solver from Single-Bit Supervision》
    《OR Talk NO.5 | Facebook 田渊栋:用深度(强化)学习为组合优化寻找更好的启发式搜索策略》
    《OR Talk NO.15 | 在业界实验室做AI设计师是一种什么体验?》
    超级跳马 —— 矩阵快速幂优化DP
    图SLAM:Noob的同时本地化和映射指南
  • 原文地址:https://www.cnblogs.com/MrRightZhao/p/10815311.html
Copyright © 2011-2022 走看看