• 代理设计模式之动态代理


    何为Java代理

    Java代理是一种设计模式----代理设计模式
    其定义为:使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
    用简单粗暴的话说,就是你要做的事情由你的经纪人代你完成 或者说 替身攻击

    何为动态代理

    提到动态代理,与其对应的则是静态代理,静态代理的特征是代理类和被代理类都是在编译时就确定下来的,不利于程序的扩展。
    而动态代理着重于动态,而相较于静态代理的写死,动态代理则能够更加灵活统一的处理众多方法

    代理的简单规则

    代理类和被代理类都要实现同一接口

    要想实现动态代理,需要解决的两个问题

    1.如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象

    2.当通过代理类的对象调用方法时,如何动态的去调用被代理类中同名的方法

    下面通过代码来让我们体会一下动态代理

    // 定义一个接口 
    interface Human {
        void hit();
        String say(String say);
    }
    
    // 定义被代理类 定义两个需要“替身攻击”的方法
    class MovieStar implements Human {
    
        @Override
        public void hit() {
            System.out.println("乌鸦坐飞机");
        }
    
        @Override
        public String say(String say) {
            return say;
        }
    }
    
    // 定义代理工厂,动态的产出代理类
    class ProxyFactory {
        // 调用此方法,返回一个代理对象,解决问题1
        public static Object getProxyInstance(Object obj) { // obj 被代理对象
            // 这里的Proxy.newProxyInstance需要传入三个参数,1.被代理对象的类加载器 2.被代理对象实现的接口, 3.InvocationHandler接口
            return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),
                    new InvocationHandler() {
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            return method.invoke(obj, args);
                        }
                    });
        }
    }
    
    // 测试类
    public class ProxyTest {
        public static void main(String[] args) {
            MovieStar movieStar = new MovieStar();
            Human proxyInstance = (Human) ProxyFactory.getProxyInstance(movieStar);
            proxyInstance.hit();
            System.out.println(proxyInstance.say("老鼠走迷宫"));
        }
    }
    

    此时,你的替身就能替你做出"乌鸦坐飞机",替你say "老鼠走迷宫"

  • 相关阅读:
    [BZOJ4755][JSOI2016]扭动的回文串(manacher+Hash)
    十二省联考2019部分题解
    [BZOJ2959]长跑(LCT+并查集)
    [BZOJ4541][HNOI2016]矿区(平面图转对偶图)
    笛卡尔树
    [CF896C]Willem, Chtholly and Seniorious(珂朵莉树)
    [BZOJ4349]最小树形图
    [BZOJ1858][SCOI2010]序列操作(线段树)
    [PA2014]Parking
    [PA2014]Budowa
  • 原文地址:https://www.cnblogs.com/211806210dingziming/p/14443150.html
Copyright © 2020-2023  润新知