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());
    
        }
    }

      

  • 相关阅读:
    推荐系统 蒋凡译 第一章 引言 读书笔记
    神经网络与深度学习 邱锡鹏 第5章 卷积神经网络 读书笔记
    神经网络与深度学习 邱锡鹏 第4章 前馈神经网络 读书笔记
    神经网络与深度学习 邱锡鹏 第3章 线性模型 读书笔记
    神经网络与深度学习 邱锡鹏 第2章 机器学习概述 读书笔记
    神经网络与深度学习 邱锡鹏 第1章 绪论 作业
    神经网络与深度学习 邱锡鹏 第1章 绪论 读书笔记
    算法笔记 上机训练实战指南 第13章 专题扩展 学习笔记
    算法笔记 第13章 专题扩展 学习笔记
    算法笔记 上机训练实战指南 第11章 提高篇(5)--动态规划专题 学习笔记
  • 原文地址:https://www.cnblogs.com/MrRightZhao/p/10815311.html
Copyright © 2011-2022 走看看