zoukankan      html  css  js  c++  java
  • 动态代理

    1. 代理模式

    代理(Proxy)是一种设计模式,提供了目标对象另外的访问方式,就是通过代理对象访问目标对象。

    这样的好处是可以给目标对象扩展功能。

    这里使用到的编程思想:不要随意去修改别人的已经写好的代码或者方法,如果需要修改那么使用代理方式来扩展改方法。

    举个例子:我们要请明星拍广告,我们不可能直接去和明星说,而是找经纪人来告诉他拍广告的事情。

    明星只负责表演,其余的事情都是经济人来搞。用图来表示:

    代理模式的关键点就是:代理对象与目标对象.代理对象是对目标对象的扩展,并且会调用目标对象。

    实例场景:我想为谷歌汽车增加功能

    定义一个汽车接口:

    package com.itheima.car;
    
    public interface Goodle {
        public void start();
    
    //汽车工作
        public void run();
    
    //汽车运行
        public void stop();
        // 汽车停止
    }

    实现接口里所有的方法:

    package com.itheima.car;
    
    public final class Car implements Goodle {
    
        @Override
        public void start() {
            // TODO Auto-generated method stub
            System.out.println("汽车工作");
        }
    
        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("汽车运行");
        }
    
        @Override
        public void stop() {
            // TODO Auto-generated method stub
            System.out.println("汽车停止");
    
        }
    
    }

    主方法:

    package com.itheima.Test;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    import com.itheima.car.Car;
    import com.itheima.car.Goodle;
    
    public class Test {
    
        public static void main(String[] args) {
            Goodle car=    (Goodle) Proxy.newProxyInstance(Test.class.getClassLoader(), Car.class.getInterfaces(),new InvocationHandler() {
            //目标实现了的接口                                    本类的加载器固定的        目标对象获取已经实现的接口中的方法     匿名对象
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    // TODO Auto-generated method stub
                    if (method.getName().equalsIgnoreCase("start")) {
                        //判断是不是start方法,如果是那么就添加检查天气功能和检查路况的功能
                        System.out.println("检查天气");
                        method.invoke(new Car(), args);
                        System.out.println("检查路况");
                    }else {
                        
                        method.invoke(new Car(), args);
                    }
                    
                    return null;
                }
            } );
            car.start();
            car.run();
            car.stop();
        }
    }

    增加功能就实现了:

    你不会的东西,觉得难的东西,一定不要躲。先搞明白,后精湛,你就比别人优秀了。因为大部分人都不舍得花力气去钻研,自动淘汰,所以你执着的努力,就占了大便宜。奋斗就是每一天都很难,可一年比一年容易。不奋斗就是每一天都很容易,可一年比一年越难。怕吃苦的人吃苦一辈子,不怕吃苦的人吃苦一阵子。拼一个春夏秋冬,赢一个无悔人生
  • 相关阅读:
    Requests 库
    Mac下终端配置(item2 + oh-my-zsh + solarized配色方案)
    中文名文件上传到linux服务器上以后文件名会乱码(openoffice)
    scp
    请求https前缀的网站验证SSL证书的解决方案之一
    jupyter notebook更换主题 步骤详解。
    jupyter nbextensions的 安装
    装饰器的学习 高级版-- 语法糖参数
    装饰器的学习 初级版-- 高阶函数,嵌套函数,闭包
    Python数据可视化的完整版操作指南(建议收藏)
  • 原文地址:https://www.cnblogs.com/ahJava/p/9738124.html
Copyright © 2011-2022 走看看