代理模式的学习

1. 概念

1.代理模式是什么?

其实就是选一个中间人,可以理解为中介,如果要买房子,先和中介去商量,中介和房主去商量,这样。

2.为什么需要代理模式?

其实还是为了安全吧,代理模式中间可以添加校验信息等,增加安全性,避免直接对类的访问

2.静态代理

1.介绍

静态代理其实就是,替身,或者克隆人。

  • 被代理类:
  • 代理类: 将被代理类作为属性,调用时相同方法,中间调用被代理类的方法
  • 接口类:定义方法,被代理类与代理类都需要实现接口

2.代码

1.接口类Person
java 复制代码
/**
* @Description: 代理对象和被代理对象的公共接口
*/
public interface Person {
    /**
     * 都具备发送消息的功能
     *
     * @param msg
     */
    void sendMsg(String msg);
}
2.被代理类Student
java 复制代码
/**
 * @Description: 被代理对象 具体的学生
 */
public class Student implements Person {

    @Override
    public void sendMsg(String msg) {
        System.out.println("I say " + msg);
    }
}
3. 代理类StudentProxy
java 复制代码
/**
 * @Description: 代理对象
 */
public class StudentProxy implements Person {

    /**
     * 代理类提前在代码中确定被代理对象是学生
     */
    private Student student;

    public StudentProxy(Student stu) {
        this.student = stu;
    }

    @Override
    public void sendMsg(String msg) {
        // 代理对象增加额外工作
        System.out.println("static proxy do something...");

        // 通过代理对象调用被代理对象的方法
        student.sendMsg(msg);
    }
}
4.总结

StudentProxy与Student都实现Person,而Proxy是实现方法同时加入自己逻辑。

3.动态代理

1.JAVA动态代理

动态代理还是反射实现

1.代理类实现InvocationHandler

因为他需要调用invoke方法

java 复制代码
public class StudentProxyInvokeHandler implements InvocationHandler {
    private Student student;

    public StudentProxyInvokeHandler(Student student) {
        this.student = student;
    }

    @Override
    public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
        System.out.println("代理成功,直接逃课");
        return method.invoke(student,objects);// 代理类调用方法调用时被代理类的方法
    }
2.实现类

使用Proxy的newProxyInstance方法来创建一个接口,通过接口去调用最终结果,这个getProxyInstance返回的其实就是Person

java 复制代码
public class ProxyFactory {

    public static Object getProxyInstance(Student student){
        StudentProxyInvokeHandler studentProxyInvokeHandler = new StudentProxyInvokeHandler(student);
        return Proxy.newProxyInstance(student.getClass().getClassLoader(), student.getClass().getInterfaces(),studentProxyInvokeHandler);
    }
}
相关推荐
凉虾皮1 小时前
2024包河初中组
学习·算法·1024程序员节
mpHH2 小时前
postgresql plancache --doing
数据库·学习·postgresql·1024程序员节
Dream_言十2 小时前
光通信|高效动态的自由空间-光纤CVB通信
学习·论文笔记·1024程序员节
小志biubiu3 小时前
linux_缓冲区及简单libc库【Ubuntu】
linux·运维·服务器·c语言·学习·ubuntu·c
奋斗的牛马5 小时前
FPGA—ZYNQ学习GPIO-EMIO(三)
学习·fpga开发
py有趣5 小时前
LeetCode算法学习之合并区间
学习·算法·leetcode
青衫码上行5 小时前
【Java Web学习 | 第1篇】前端 - HTML
java·前端·学习
charlie1145141915 小时前
HTML 理论笔记
开发语言·前端·笔记·学习·html·1024程序员节
知识分享小能手6 小时前
uni-app 入门学习教程,从入门到精通,uni-app 企业项目实战:鲁嗑瓜子项目开发知识点(9)
前端·javascript·学习·微信小程序·小程序·uni-app·vue
知识分享小能手6 小时前
uni-app 入门学习教程,从入门到精通,uni-app中uCharts组件学习((8)
vue.js·学习·ui·微信小程序·小程序·uni-app·echarts