反射与代理设计模式那点事儿

反射与代理设计模式

静态代理设计模式

  • 我们先来看看传统的代理设计模式
  • 如果按照设计要求来讲,必须是基于接口的设计,也就是说,要先定义一个核心的接口类。
package 阿里云大学java.java高级学习.反射练习;

class MessageReal implements IMessage{
    @Override
    public void send() {
        System.out.println("【发送消息】阿鸡是笨蛋");
    }
}

class MessageProxy implements IMessage {
    private IMessage message;   //代理对象,一定是业务接口实例;
    public MessageProxy(MessageReal message){
        this.message = message;
    }
    public boolean connect(){
        System.out.println("【消息代理】进行消息发送通道的链接");
        return true;
    }
    public void close(){
        System.out.println("【消息代理】关闭消息通道");
    }
    @Override
    public void send() {
        if(this.connect()){
            this.message.send();
            this.close();
        }
    }
}

public class 反射与代理设计模式 {
    public static void main(String[] args) {
        IMessage message = new MessageProxy(new MessageReal());
        message.send();
    }
}

  • 以后代码呢,就是我们传统的代理模式了,但是只要认真进行思考一番就会发现, 客户端的接口与具体的子类产生了耦合问题,所以这样的操作如果从实际开发来讲,我们最好引入工厂设计模式进行代理对象的获取;
  • 以上的代理设计模式是静态的代理设计模式,这种模式有一个特点:一个代理类只为一个接口服务,那么如果现在有很多中接口,那么我们就要编写n个代理类,
  • 现在就产生了一个问题:如何让一个代理类满足所有的业务接口需求,这个就是传统代理设计不具备的,所有我们只能使用动态代理设计来实现。

动态代理设计模式

在这里插入图片描述

  • 在进行我们动态代理之中呢,我们首先该关注的就是invocationHandler接口,这个接口规定了我们的代理方法的执行。
  • 在进行动态代理设计的时候对于动态对象的创建是由JVM底层完成的,此时主要依靠我们Java.lang.reflect.Proxy程序类,这个程序类里面有一个重要的程序方法:
  • newProxyInstance(ClassLoader loader, Class<?>[] interfaces , InvocationHander h);
package 阿里云大学java.java高级学习.反射练习;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 动态代理
class DTProxy implements InvocationHandler {
    private Object target;

    /**
     * 进行真实的业务对象和代理的业务对象之间的绑定处理
     * @param target   真实的业务对象
     * @return Proxy生成的代理业务对象
     */
    public Object bind(Object target){
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    }
    public boolean connect(){
        System.out.println("【消息代理】进行消息发送通道的链接");
        return true;
    }
    public void close(){
        System.out.println("【消息代理】关闭消息通道");
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("【执行方法】:" + method);
        Object returnData = null;
        if(this.connect()){
            returnData = method.invoke(this.target,args);
            this.close();
        }
        return returnData;
    }
}

class MessageReal implements IMessage{
    @Override
    public void send() {
        System.out.println("【发送消息】阿鸡是傻逼");
    }
}

class MessageProxy implements IMessage {
    private IMessage message;   //代理对象,一定是业务接口实例;
    public MessageProxy(MessageReal message){
        this.message = message;
    }
    public boolean connect(){
        System.out.println("【消息代理】进行消息发送通道的链接");
        return true;
    }
    public void close(){
        System.out.println("【消息代理】关闭消息通道");
    }
    @Override
    public void send() {
        if(this.connect()){
            this.message.send();
            this.close();
        }
    }
}

public class 反射与代理设计模式 {
    public static void main(String[] args) {
        //IMessage message = new MessageProxy(new MessageReal());
        IMessage message = (IMessage) new DTProxy().bind(new MessageReal());
        message.send();
    }
}

  • 说实话,我看了很久,还不是特别的理解这些,害,慢慢来,会理解的,加油

CGLIB实现代理设计模式

  • 从java官方来讲已经明确的要求了如果要实现代理设计模式,那么一定是基于接口的应用,所以在我们官方给出Proxy类创建代理对象时,都需要传递所有的接口信息;
  • 这玩意还要导入第三方工具包,害,头痛呀
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

木木不会

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

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

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

打赏作者

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

抵扣说明:

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

余额充值