动态代理相关知识记录

静态代理

在这里插入图片描述

抽象角色 指代理角色和真实角色对外提供的公共方法,一般为一个接口

真实角色 需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。也就是真正的业
务逻辑在此

代理角色 需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附
加自己的操作。将统一的流程控制都放到代理角色中处理!

静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。一般
来说,被代理对象和代理对象是一对一的关系,当然一个代理对象对应多个被代理对象也是可以的。
静态代理,一对一则会出现时静态代理对象量多、代码量大,从而导致代码复杂,可维护性差的问题,一对多则代
理对象会出现扩展能力差的问题。所以后面就出现了动态代理
其实我理解的静态代理有点和里式替换有点类似:不知道理解的对不对,如果理解有误还请指正
如下图:
在这里插入图片描述
具体代码逻辑eg:

/**
 * 代理抽象角色: 定义了服务的接口
 */
public interface Massage {
    void massage();
}

/**
 * 真实实现类: 提供马杀鸡服务的露西
 */
public class Lucy implements Massage {
    
    @Override
    public void massage() {
        System.out.println("36D,手法一流");
    }
}

/**
 * 代理对象:马杀鸡经纪人
 */
public class Agent implements Massage {

    private final Massage massage;

    public Agent(Massage massage) {
        this.massage = massage;
    }

    //....前置处理
    public void before() {
        System.out.println("一条龙服务,包君满意");
    }

    //....后置处理
    public void after() {
        System.out.println("满意度调查");
    }

    @Override
    public void massage() {
        before();
        massage.massage();
        after();
    }
}

//调用:
    public static void main(String[] args) throws Exception {
        //静态代理
        Massage message = new Lucy();
        Agent agent = new Agent(message);
        agent.massage();
}

动态代理

典型代码如下:

//抽象角色 
interface Api {
 void test(String a); 
}

//真实角色 
class ApiImpl{
 @Override 
 public void test(String a) {
  System.out.println("真实实现:" + a); 
  } 
}

//创建真实角色实例 
ApiImpl api = new ApiImpl();

Object o = Proxy.newProxyInstance(MyClass.class.getClassLoader(),
                new Class[]{Api.class}, //JDK实现只能代理接口
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
//                        System.out.println(o.toString());
                        return method.invoke(api,objects);
                    }
                });

实际上, Proxy.newProxyInstance 会创建一个Class,与静态代理不同,这个Class不是由具体的.java源文件编译
而来,即没有真正的文件,只是在内存中按照Class格式生成了一个Class。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex_ChuTT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值