代理模式的学习

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);
    }
}
相关推荐
辰海Coding5 小时前
MiniSpring框架学习笔记-解决循环依赖的简化IoC容器
笔记·学习
晓梦林5 小时前
cp520靶场学习笔记
android·笔记·学习
心中有国也有家6 小时前
cann-recipes-infer:昇腾 NPU 推理的“菜谱集合”
经验分享·笔记·学习·算法
Upsy-Daisy6 小时前
AI Agent 项目学习笔记(八):Tool Calling 工具调用机制总览
人工智能·笔记·学习
LuminousCPP8 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
魔法阵维护师8 小时前
从零开发游戏需要学习的c#模块,第十四章(保存和加载)
学习·游戏·c#
_李小白9 小时前
【android opencv学习笔记】Day 17: 目标追踪(MeanShift)
android·opencv·学习
一只机电自动化菜鸟9 小时前
一建机电备考笔记(40) 建筑机电施工—排水管道施工(含考频+题型)
经验分享·笔记·学习·职场和发展·课程设计
2301_818730569 小时前
numpy的学习(笔记)
学习·numpy
GHL28427109010 小时前
Logon failed, use ctrl+c to cancel basic credential prompt
学习·prompt