代理模式的学习

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);
    }
}
相关推荐
moxiaoran57532 小时前
uni-app学习笔记三十--request网络请求传参
笔记·学习·uni-app
嘉陵妹妹2 小时前
深度优先算法学习
学习·算法·深度优先
乖乖是干饭王3 小时前
Linux系统编程中的_GNU_SOURCE宏
linux·运维·c语言·学习·gnu
待什么青丝4 小时前
【TMS570LC4357】之相关驱动开发学习记录2
c语言·arm开发·驱动开发·单片机·学习
行云流水剑4 小时前
【学习记录】如何使用 Python 提取 PDF 文件中的内容
python·学习·pdf
虾球xz5 小时前
CppCon 2015 学习:CLANG/C2 for Windows
开发语言·c++·windows·学习
蓝婷儿6 小时前
6个月Python学习计划 Day 17 - 继承、多态与魔术方法
开发语言·python·学习
持续前进的奋斗鸭6 小时前
Postman测试学习(1)
学习·postman
hello kitty w7 小时前
Python学习(7) ----- Python起源
linux·python·学习
一叶知秋秋7 小时前
python学习day39
人工智能·深度学习·学习