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

这篇具有很好参考价值的文章主要介绍了设计模式再探——代理模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景介绍

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

二、思路&方案

  • 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.后续还可以通过自定义注解,或者包扫描的方式;进一步优化使用端

五、升华

当你的认知提升一个等级之后,再回头看经历过的知识,将会获得不一样的认识文章来源地址https://www.toymoban.com/news/detail-620502.html

到了这里,关于设计模式再探——代理模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式8:代理模式-静态代理

    我尝试在JDK、Android SDK和一些出名的库中,寻找静态代理的源码,没能找到。如果有读者发现,欢迎评论或者私信我。 1. 售票代理 售票服务 站点售票 代理网点售票 2. 明星代理

    2024年02月11日
    浏览(25)
  • Java设计模式 (三) 代理设计模式

    什么是代理设计模式? 代理设计模式是一种结构型设计模式,它允许创建一个代理对象,用于控制对其他对象的访问。代理模式通常用于在访问对象时添加一些附加操作,而不是直接访问真实对象。代理模式可以在不改变原始类代码的情况下,通过引入代理类来增强功能。 代

    2024年02月12日
    浏览(35)
  • 设计模式-代理模式

    ● 为对象提供一个代理类,增强该对象的方法,控制对这个对象的访问 ● 静态代理和动态代理:静态代理就是编译的时候就已经确定,而动态代理就是运行时才会生成 缓存代理 ● 提供数据的缓存功能,避免数据库重复查询 实践 定义数据查询的接口 接口实现类实现接口

    2024年02月11日
    浏览(30)
  • 【设计模式】代理模式

    5.1.1 概述 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。 Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理代理类在编译期就生成

    2024年02月15日
    浏览(39)
  • 设计模式之代理模式

    当我们有对象因为安全性,不能直接对外暴露,或者是需要对对象的操作本身记录日志等信息时就可以考虑使用代理模式, 享元设计模式,包含如下元素: UML图如下: 另外,代理又分为静态代理和动态代理,静态代理就是在编译器已经确定的代理方式,即是硬编码到程序中

    2024年02月16日
    浏览(26)
  • 设计模式二:代理模式

    1、什么是动态代理 可能很多小伙伴首次接触动态代理这个名词的时候,或者是在面试过程中被问到动态代理的时候,不能很好的描述出来,动态代理到底是个什么高大上的技术。不方,其实动态代理的使用非常广泛,例如我们平常使用的 Spring 中的 @Transactional 注解,其依赖

    2024年02月20日
    浏览(34)
  • 设计模式(5)代理模式

    一、介绍: 1、组成结构: (1)Subject/抽象角色:定义了RealSubject和Proxy的共用接口,这样就可以在任何使用        RealSubject的地方都可以使用Proxy (2)RealSubject/真实角色:定义Proxy所代表的真实实体 (3)Proxy/代理角色:保存一个引用使得代理可以访问实体,并提供一个与

    2024年02月13日
    浏览(26)
  • 设计模式|代理模式

    ​代理模式指为其他对象提供一种代理,以控制对这个对象的访问。在某些情况下,一个对象若不能直接引用另一个对象,而代理对象可以在客户端与目标对象之间起到中介的作用。 普通代理 普通代理模式是指在代理模式中,代理对象和真实对象都实现了相同的接口或继承

    2024年02月04日
    浏览(26)
  • 【设计模式】-代理模式

    在软件开发中,经常遇到需要对某个对象进行控制或者监控的场景。而直接修改对象的代码可能使代码变得复杂且难以维护。这时,使用代理模式(Proxy Pattern)可以很好地解决这个问题。          代理模式是一种结构型设计模式, 通过引入一个代理对象来替代原始对象

    2024年02月13日
    浏览(28)
  • 设计模式--代理模式

    笔记来源:尚硅谷Java设计模式(图解+框架源码剖析) 1)代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即 通过代理对象访问目标对象 2)这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能 3)被代理的对象可以

    2024年02月10日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包