zoukankan      html  css  js  c++  java
  • 代理设计模式之动态代理

    何为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 "老鼠走迷宫"

  • 相关阅读:
    HTML5-拖拽
    POJ1182食物链(并查集)
    欧拉函数之HDU1286找新朋友
    Another kind of Fibonacce(矩阵快速幂,HDU3306)
    我的第一道java_A+B
    bestcoder#33 1002 快速幂取余+模拟乘,组合数学
    快速幂模版
    bestcoder#33 1001 高精度模拟
    poj2446_二分图
    poj3984_bfs+回溯路径
  • 原文地址:https://www.cnblogs.com/211806210dingziming/p/14443150.html
Copyright © 2011-2022 走看看