设计模式——代理模式

简介

1、定义

为其他对象提供一种代理以控制对这个对象对访问。

2、特点

代理模式关注于对目标方法的控制。代理者拥有控制权限,可以决定目标方法是否调用。

实现方式

1、静态代理

public interface ISubject {
    void doSomeThing();
}
public class SubjectImpl implements ISubject {

    public void doSomeThing() {
        System.out.println("do some thing...");
    }
}
public class SubjectProxy implements ISubject {

    private ISubject target;

    public SubjectProxy(ISubject target) {
        this.target = target;
    }

    public void doSomeThing() {
        System.out.println("before....");
        target.doSomeThing();
        System.out.println("after....");
    }
}

2、动态代理

2.1 JDK动态代理

public interface ISubject {
    void doSomeThing();
}
public class SubjectImpl implements ISubject {

    public void doSomeThing() {
        System.out.println("do some thing...");
    }
}
public class SubjectJdkProxy implements InvocationHandler {

    private ISubject target;

    public Object getProxyInstance(ISubject target) {
        this.target = target;
        Class<? extends ISubject> clazz = target.getClass();
        return Proxy.newProxyInstance(clazz.getClassLoader(), clazz.getInterfaces(), this);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before...");
        method.invoke(target, args);
        System.out.println("after...");
        return null;
    }
}

2.2 CGLIB(Code Generation Library)

public class SubjectImpl {
    void doSomething() {
        System.out.println("do some thing...");
    }
}
public class SubjectCglibProxy implements MethodInterceptor{

    public Object getInstance(Class clazz) throws Exception {
        Enhancer enhancer = new Enhancer();
        // 告诉cglib,生成的子类需要继承哪个类
        enhancer.setSuperclass(clazz);

        // 设置回调
        enhancer.setCallback(this);

        // 生成源码,编译成class,加载到JVM中,并返回代理对象
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("before...");
        methodProxy.invokeSuper(o, objects);
        System.out.println("after...");
        return null;
    }
public class MyTest {
    public static void main(String[] args) throws Exception {

        SubjectImpl cglibProxy = (SubjectImpl) new SubjectCglibProxy().getInstance(new SubjectImpl().getClass());
        cglibProxy.doSomething();
    }
}

手写JDK动态代理

自定义ClassLoader

public class MyClassLoader extends ClassLoader{

    private File dirPath;

    public MyClassLoader(){
        String basePath = MyClassLoader.getSystemResource("").getPath();
        this.dirPath = new File(basePath);
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        String className = MyClassLoader.class.getPackage().getName()+"."+name;

        if (dirPath != null) {
            File classFile = new File(dirPath, className.replaceAll("\\.", "/")+".class");
            if (classFile.exists()) {
                FileInputStream fileInputStream = null;
                ByteOutputStream outputStream = null;
                try {
                    fileInputStream = new FileInputStream(classFile);
                    outputStream = new ByteOutputStream();
                    byte[] buffer = new byte[1024];
                    int len;
                    while ((len = fileInputStream.read(buffer)) != -1){
                        outputStream.write(buffer, 0, len);
                    }
                    return defineClass(className, outputStream.getBytes(), 0, outputStream.size());
                }catch (Exception e) {

                }finally {
                    if (fileInputStream != null){
                        try {
                            fileInputStream.close();
                        }catch (Exception e) {

                        }
                    }
                    try {
                        if (outputStream != null) {
                            outputStream.close();
                        }
                    }catch (Exception e){

                    }
                   // classFile.delete();
                }
            }
        }
        return null;
    }
}

自定义InvocationHandler

public interface MyInvocationHandler {

    Object invoke(Object proxy, Method method, Object[] args) throws Throwable;
}

自定义Proxy类

public class MyProxy {

    public static Object newProxyInstance(MyClassLoader classLoader,
                                          Class<?>[] interfaces,
                                          MyInvocationHandler h){
        try{
            // 1、生成源代码
            String proxySrc = generateSrc(interfaces[0]);

            // 2、将生成的源代码输出到磁盘,保存为.java文件
            String filePath = MyProxy.class.getResource("").getPath();
            File proxyFile = new File(filePath, "$Proxy0.java");
            FileWriter fileWriter = new FileWriter(proxyFile);
            fileWriter.write(proxySrc);
            fileWriter.flush();
            fileWriter.close();


            // 3、编译源代码,并且生成c.class文件
            JavaCompiler javaCompiler = ToolProvider.getSystemJavaCompiler();
            StandardJavaFileManager manager = javaCompiler.getStandardFileManager(null, null, null);
            Iterable iterable = manager.getJavaFileObjects(proxyFile);
            JavaCompiler.CompilationTask task = javaCompiler.getTask(null, manager,null,  null, null, iterable);
            task.call();
            manager.close();
            // 4、将class加载到JVM
            Class proxyClass = classLoader.findClass("$Proxy0");
            // 5、返回代理对象
            Constructor constructor = proxyClass.getConstructor(MyInvocationHandler.class);

            return constructor.newInstance(h);

        }catch (Exception e){
            System.out.println();
        }
        return null;

    }

    private static String generateSrc(Class<?> interfaces) {
        String enter = "\r\n";
        StringBuffer sb = new StringBuffer();
        sb.append("package cn.xiaoyanol.learn.design.pattern.proxy.myjdk;"+enter);
        sb.append("import java.lang.reflect.Method;"+ enter);
        sb.append("public class $Proxy0 implements " + interfaces.getName() + "{" + enter);

        sb.append("MyInvocationHandler h;"+ enter);

        sb.append("public $Proxy0(MyInvocationHandler h) {" + enter);
        sb.append("this.h = h;" + enter);
        sb.append("}" + enter);

        for (Method m : interfaces.getMethods()) {
            sb.append("public " + m.getReturnType().getName() + " " + m.getName() + "(){" + enter);

            sb.append("try{" + enter);
            sb.append("Method m = " + interfaces.getName() + ".class.getMethod(\"" + m.getName() + "\",new Class[]{});" + enter);
            sb.append("this.h.invoke(this,m,null);" + enter);
            sb.append("}catch(Throwable e){e.printStackTrace();}" + enter);
            sb.append("}" + enter);
        }

        sb.append("}");
        return sb.toString();
    }

}
标题基于SpringBoot的马术俱乐部管理系统设计与实现AI更换标题第1章引言介绍马术俱乐部管理系统的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义阐述马术俱乐部管理系统对提升俱乐部管理效率的重要性。1.2国内外研究现状分析国内外马术俱乐部管理系统的发展现状及存在的问题。1.3研究方法以及创新点概述本文采用的研究方法,包括SpringBoot框架的应用,以及系统的创新点。第2章相关理论总结和评述与马术俱乐部管理系统相关的现有理论。2.1SpringBoot框架理论介绍SpringBoot框架的基本原理、特点及其在Web开发中的应用。2.2数据库设计理论阐述数据库设计的基本原则、方法以及在管理系统中的应用。2.3马术俱乐部管理理论概述马术俱乐部管理的基本理论,包括会员管理、课程安排等。第3章系统设计详细描述马术俱乐部管理系统的设计方案,包括架构设计、功能模块设计等。3.1系统架构设计给出系统的整体架构,包括前端、后端和数据库的交互方式。3.2功能模块设计详细介绍系统的各个功能模块,如会员管理、课程管理、预约管理等。3.3数据库设计阐述数据库的设计方案,包括表结构、字段设计以及数据关系。第4章系统实现介绍马术俱乐部管理系统的实现过程,包括开发环境、编码实现等。4.1开发环境搭建介绍系统开发所需的环境,包括操作系统、开发工具等。4.2编码实现详细介绍系统各个功能模块的编码实现过程。4.3系统测试与调试阐述系统的测试方法、测试用例以及调试过程。第5章系统应用与分析呈现马术俱乐部管理系统的应用效果,并进行性能分析。5.1系统应用情况介绍系统在马术俱乐部中的实际应用情况。5.2系统性能分析从响应时间、并发处理能力等方面对系统性能进行分析。5.3用户反馈与改进收集用户反馈,提出系统改进建议。第6章结论与展望总结马术俱乐部管理系统的设计与实现成果,并展望未来的研究
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值