设计模式再探——代理模式

一、背景介绍

最近在做产品过程中对于日志的统一收集做了深入的研究,最终映射到代理模式的运用上了,通过对代理模式的再探,对代理模式的敬畏又进行了一层升华。

二、思路&方案

  • 1.代理模式简介
  • 2.代理模式的类图
  • 3.代理模式代码
  • 4.代理模式还可以优化的地方
  • 5.代理模式的项目实战,优化后

三、过程

1.代理模式简介

代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问

2.代理模式的类图

在这里插入图片描述

3.代理模式代码

package com.a7DesignPattern.a2StructuralType.a07Proxy;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/22 10:02
 */
public abstract class Subject {
    
    
    public abstract void Request();
}

package com.a7DesignPattern.a2StructuralType.a07Proxy;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/22 10:03
 */
public class RealSubject extends Subject{
    
    
    @Override
    public void Request() {
    
    
        System.out.println("真实对象");
    }
}

package com.a7DesignPattern.a2StructuralType.a07Proxy;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/22 10:04
 */
public class Proxy extends Subject{
    
    
    private RealSubject realSubject;

    @Override
    public void Request() {
    
    
        if(realSubject == null){
    
    
            realSubject = new RealSubject();
        }
        realSubject.Request();
    }
}

package com.a7DesignPattern.a2StructuralType.a07Proxy;

/**
 * 功能描述:
 *
 * @Author:makang
 * @Date: 2021/5/22 10:06
 */
public class Client {
    
    
    public static void main(String[] args) {
    
    
        Subject subject = new Proxy();
        subject.Request();
    }
}

4.代理模式还可以优化的地方

  • 1.通过代理类中使用泛型,将被代理对象延迟到运行时定义。
  • 2.通过自定义注解或者包扫描的方式,将使用端进行一步优化

5.代理模式的项目实战,优化后(只加了泛型方式,使用CGLIB的代理)

package com.b0032AOP例子_CGLIB动态代理.V1基础例子;

public class Calimpl{
    
    

    public int add(int num1, int num2) {
    
    
        return num1 + num2;
    }

    public int sub(int num1, int num2) {
    
    
        return num1 - num2;
    }

    public int mul(int num1, int num2) {
    
    
        return num1 * num2;
    }

    public int div(int num1, int num2) {
    
    
        return num1 / num2;
    }

}

package com.b0032AOP例子_CGLIB动态代理.V1基础例子;


import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.Arrays;

public class MyMethodInterceptor<T> implements MethodInterceptor {
    
    

    public T getBind(Class<?> object){
    
    
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(object);
        enhancer.setCallback(new MyMethodInterceptor());
        return (T)enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
    
    
        System.out.println(method.getName() + "方法的参数是"+ Arrays.toString(objects));
        Object result = methodProxy.invokeSuper(o,objects);
        System.out.println(method.getName()+"方法的结果是"+result);
        return result;
    }
}

package com.b0032AOP例子_CGLIB动态代理.V1基础例子;

public class Client {
    
    
    public static void main(String[] args) {
    
    

        MyMethodInterceptor<Calimpl> myMethodInterceptor = new MyMethodInterceptor();
        Calimpl calimplProxy = myMethodInterceptor.getBind(Calimpl.class);

        calimplProxy.add(1,1);
        calimplProxy.sub(2,2);
        calimplProxy.mul(3,3);
        calimplProxy.div(4,4);

    }
}

四、总结

  • 1.代理模式的思想,通过将行为的抽象在运行时进行动态干预使得复用性、灵活性都做到了极大的提高
  • 2.将单纯的代理模式通过和泛型的结合,使得灵活性再次提升
  • 3.后续还可以通过自定义注解,或者包扫描的方式;进一步优化使用端

五、升华

当你的认知提升一个等级之后,再回头看经历过的知识,将会获得不一样的认识

猜你喜欢

转载自blog.csdn.net/u013030601/article/details/132010054