代理模式

代理模式是springAOP的底层。【SpringAOP和AringMVC】

代理模式的分类:

  • 静态代理
  • 动态代理
    在这里插入图片描述

1.静态代理

角色分析:

  • 抽象角色:一般会使用接口或者抽象类来解决
  • 真实角色:被代理的角色
  • 代理角色:代理真实角色,代理真实角色后,会做一些附属操作
  • 客户:访问代理对象的人。

代理模式的好处:

  • 可以使真实角色更加纯粹,不用去关注一些公共业务
  • 公共也就交给了代理角色!实现业务分工!
  • 公共业务发生拓展的时候,便于管理

缺点:

  • 一个真实角色就会有一个代理角色;代码量翻倍,开发效率变低

代码步骤:

  1. 接口

    public interface Rent {
        public void rent();
    }
    
    
  2. 真实角色

    //房东
    public class Host implements Rent{
    
        @Override
        public void rent() {
            System.out.println("房东要出租房子!");
        }
    }
    
  3. 代理角色

    public class Proxy implements Rent{
        private Host host;
    
        public Proxy(Host host) {
            this.host = host;
        }
    
        public Proxy() {
        }
    
        @Override
        public void rent() {
            host.rent();
            seeHouse();
            hetong();
            fare();
        }
    
        //看房
        public void seeHouse(){
            System.out.println("中介带你看房");
        }
        //收中介费
        public void fare(){
            System.out.println("收中介费");
        }
        //签合同
        public void hetong(){
            System.out.println("签合同");
        }
    }
    
  4. 客户端访问代理角色

    public class Client {
        public static void main(String[] args) {
            //房东要租房子
            Host host = new Host();
            //代理角色有一些附属操作,帮房东租房子
            Proxy proxy = new Proxy(host);
            //不用面对房东,找中介即可
            proxy.rent();
        }
    }
    

2.动态代理

  • 动态代理和静态代理角色一样
  • 动态代理的动态代理类是动态生成的,不是我们写好的。
  • 动态代理分为两大类:
    • 基于接口–JDK动态代理
    • 基于类的动态代理 cglib
    • java字节码:javasist

需要了解两个类:Pxory:代理,InvocationHandler:处理

动态代理的好处:

  • 可以使真实角色更加纯粹,不用去关注一些公共业务

  • 公共也就交给了代理角色!实现业务分工!

  • 公共业务发生拓展的时候,便于管理

  • 一个动态代理类代理的是一个接口,一般就是对应一类业务

  • 一个动态代理类,代理多个类,只要是实现了同一个接口即可!

    模板代理

    package cn.leoeric.demo04;
    
    import cn.leoeric.demo03.Rent;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    //用这个类动态生成代理类
    public class ProxyInvocationHandler implements InvocationHandler {
    
    
    
        //被代理的接口
        private Object target;
        public void setTarget(Object target) {
            this.target = target;
        }
    
    
        public void setRent(Rent rent) {
            this.target = rent;
        }
    
        //得到生成代理类
        public Object getProxy(){
            return Proxy.newProxyInstance(this.getClass().getClassLoader(),
                    target.getClass().getInterfaces(), this);
        }
    
    
        //处理代理实例,并返回结果
        @Override
        public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
    
            Object result = method.invoke(target,objects);
    
            return result;
        }
    }
    
    
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读