代理模式的学习

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);
    }
}
相关推荐
一只乔哇噻9 分钟前
java后端工程师进修ing(研一版 || day41)
java·开发语言·学习·算法
知识分享小能手23 分钟前
React学习教程,从入门到精通,React 使用属性(Props)创建组件语法知识点与案例详解(15)
前端·javascript·vue.js·学习·react.js·前端框架·vue
User_芊芊君子28 分钟前
【Java】设计模式——单例、工厂、代理模式
java·设计模式·代理模式
知识分享小能手7 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
茯苓gao9 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾9 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT10 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa10 小时前
HTML和CSS学习
前端·css·学习·html
看海天一色听风起雨落11 小时前
Python学习之装饰器
开发语言·python·学习
speop12 小时前
llm的一点学习笔记
笔记·学习