代理模式的学习

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);
    }
}
相关推荐
日拱一卒的小田5 小时前
ZYNQ学习笔记4-ZYNQ的SD卡控制器1
笔记·学习
拼图2097 小时前
Git常用语法
分布式·git·学习
Vcaker8 小时前
Linux学习29-kubernetes网络
学习
dadaobusi11 小时前
学习:奈奎斯特
学习
传奇开心果编程13 小时前
【Go入门练中学】第2课:条件与循环
后端·学习·golang
小小de风呀14 小时前
de风——【从零开始学C++】(二十)红黑树封装map和set
c++·学习
爱吃苹果的日记本14 小时前
数据结构第四课—线性表Linear List
数据结构·学习
昌原的儿子LEO14 小时前
ARM 汇编核心知识点总结
嵌入式硬件·学习
Ray Wang14 小时前
Context上下文工程
python·学习·ai编程
百里香酚兰14 小时前
【Unity学习笔记】如何把粉色Prefab还原
笔记·学习·unity