代理设计模式

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();
    }
}
原文地址:https://www.cnblogs.com/mxj961116/p/11270320.html