• 代理设计模式


    1.代理设计模式优点

      保护真实对象、让真实对象职责更明确、扩展功能

    2.静态代理设计模式

      由代理对象代理所有真实对象的功能

        自己编写代理类

        每个代理的功能需要单独编写

    3.静态代理设计模式缺点

      当代理功能比较多时,代理类中方法需要写很多

    public class Laozong implements Gongneng{
        private String name;
        
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public Laozong(String name) {
            super();
            this.name = name;
        }
    
        public Laozong() {
            super();
        }
        
        public void mianshi(){
            System.out.println("面试");
        }
    }
    public class MiShu implements Gongneng{
        private Laozong laozong = new Laozong("云云");
        @Override
        public void mianshi() {
            System.out.println("请问你有预约吗?");
            laozong.mianshi();
            System.out.println("把访客信息备注");
        }
    }
    public interface Gongneng {
        void mianshi();
    }

    4.动态代理

      为了解决静态代理频繁编写代理功能的缺点

      分类:

        JDK动态代理

        cglib动态代理

    5.JDK动态代理

      优点:jdk自带,不需要额外导入jar

      缺点:

        真实对象必须实现接口

        利用反射机制,效率不高

    public class Laozong implements Gongneng{
        @Override
        public void chifan() {
            System.out.println("吃饭");
        }
        @Override
        public void mubiao() {
            System.out.println("目标");
        }
    }
    public class Mishu implements InvocationHandler{
        private Laozong laozong=new Laozong();
        
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("预约时间");
            Object result = method.invoke(laozong, args);
            System.out.println("记录访客信息");
            return result;
        }
    }
    public class Women {
        public static void main(String[] args){
            Mishu mishu = new Mishu();
            /**
             * 第一个参数:反射时使用的类加载器
             * 第二个参数:Proxy需要实现什么接口
             * 第三个参数:通过接口对象调用方法时,需要调用哪个类的invoke方法
             */
            Gongneng gongneng = (Gongneng)Proxy.newProxyInstance(Women.class.getClassLoader(), new Class[]{Gongneng.class}, mishu);
            gongneng.chifan();
        }
    }

    6.cglib动态代理

      优点:

        基于字节码,生成真实对象的子类

        运行效率高于JDK动态代理

        不需要实现接口

      缺点:非JDK功能,需要额外导入jar

    public class Laozong{
    
        public void chifan() {
            System.out.println("吃饭");
        }
        public void mubiao() {
            System.out.println("目标");
        }
    }
    public class Mishu implements MethodInterceptor{
    
        @Override
        public Object intercept(Object arg0, Method arg1, Object[] arg2, MethodProxy arg3) throws Throwable {
            System.out.println("预约时间");
            //invoke()调用子类重写方法        
            arg3.invokeSuper(arg0, arg2);
            return null;
        }
    }
    public class Women {
        public static void main(String[] args){
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(Laozong.class);
            enhancer.setCallback(new Mishu());        
            Laozong laozong = (Laozong)enhancer.create();
            laozong.chifan();
        }
    }
  • 相关阅读:
    快速排序(java实现)
    java8 stream一些知识
    Lombok安装、简单使用、入门
    explain mysql 结果分析
    MySQL调优三部曲(二)EXPLAIN
    MySQL调优三部曲(一)慢查询
    排查问题
    Dynamics 365 获取值 设置值
    MySql CP 表 和 数据
    Dynamics 365单项选项集&多项选项集
  • 原文地址:https://www.cnblogs.com/mxj961116/p/11270320.html
Copyright © 2020-2023  润新知