首页 > 其他分享 >跟着GPT学设计模式之代理模式

跟着GPT学设计模式之代理模式

时间:2024-03-02 09:46:20浏览次数:23  
标签:对象 代理 Proxy realSubject GPT 设计模式 public Subject

引言

代理模式(Proxy Design Pattern)在不改变原始类(或叫被代理类)代码的情况下,通过引入代理类来给原始类附加功能。

代理模式的关键角色包括:

  • 抽象主题(Subject):定义了目标对象和代理对象的共同接口,这样一来在任何可以使用目标对象的地方都可以使用代理对象。
  • 目标对象(Real Subject):也称为被代理对象,是具体业务逻辑的实际执行者。
  • 代理对象(Proxy):负责代理目标对象,它持有对目标对象的引用,并在其自身的方法中调用目标对象的方法,同时还可以在调用前后进行一些其他的操作。

应用场景

代理模式可以应用于许多场景,以下是几个常见的应用场景:

  • 远程代理(Remote Proxy):代理模式可以用来在客户端和远程对象之间建立代理对象,隐藏了实际的网络通信细节。客户端通过代理对象调用远程对象的方法,而无需关心网络通信的具体实现。
  • 虚拟代理(Virtual Proxy):代理模式可以用来延迟加载资源密集或耗时的对象,只有当真正需要使用这些对象时,才会创建并加载真实的对象。虚拟代理可以在一定程度上提升系统性能和响应速度。
  • 安全代理(Protection Proxy):代理模式可以用来控制对敏感对象的访问权限。代理对象可以在调用目标对象方法之前检查权限,如果没有足够的权限,则不允许访问。
  • 缓存代理(Caching Proxy):代理模式可以用来缓存目标对象的计算结果,当相同的请求再次到达时,可以直接返回缓存的结果,避免重复计算,提高系统性能。
  • 日志记录代理(Logging Proxy):代理模式可以在目标对象的方法执行前后进行日志记录,用于跟踪和调试系统运行过程中的操作。
  • AOP(面向切面编程):代理模式是实现AOP的基础,可以通过代理对象在目标对象的方法执行前后插入切面逻辑,例如日志、事务管理等。

需要注意的是,代理模式并非适用于所有情况。在某些场景下,代理模式可能引入额外的复杂性和性能开销,需要根据具体问题和需求来决定是否使用代理模式。

编程示例

代理模式的实现方式有多种,常见的有静态代理和动态代理两种形式:

  • 静态代理:在编译时期就已经确定代理关系,代理类和目标类的关系在代码中明确指定。
// 抽象主题
public interface Subject {
    void request();
}

// 目标对象
@Slf4j
public class RealSubject implements Subject {
    @Override
    public void request() {
        // 具体业务逻辑
        LOGGER.info("开始处理请求");
    }
}

@Slf4j
public class Proxy implements Subject {
    private Subject realSubject;

    public Proxy(Subject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void request() {
        LOGGER.info("前置处理逻辑");
        // 执行一些额外的操作
        realSubject.request();
        // 执行一些额外的操作
        LOGGER.info("后置处理逻辑");
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Subject realSubject = new RealSubject();  // 创建目标对象
        Subject proxy = new Proxy(realSubject);  // 创建代理对象

        proxy.request();  // 通过代理对象调用目标对象的方法
    }
}
  • 动态代理:在运行时动态生成代理类,无需提前编写代理类。Java 中的动态代理主要通过 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口实现。
// 抽象主题
public interface Subject {
    void request();
}

// 目标对象
@Slf4j
public class RealSubject implements Subject {
    @Override
    public void request() {
        // 具体业务逻辑
        LOGGER.info("开始处理请求");
    }
}
// InvocationHandler 实现类
public class DynamicProxy implements InvocationHandler {
    private Object target;

    public DynamicProxy(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 执行一些额外的操作
        LOGGER.info("前置处理逻辑");
        Object result = method.invoke(target, args);
        // 执行一些额外的操作
        LOGGER.info("后置处理逻辑");
        return result;
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        Subject realSubject = new RealSubject();  // 创建目标对象

        InvocationHandler handler = new DynamicProxy(realSubject);  // 创建 InvocationHandler 实现类
        Subject proxy = (Subject) Proxy.newProxyInstance(
            realSubject.getClass().getClassLoader(),
            realSubject.getClass().getInterfaces(),
            handler
        );  // 创建动态代理对象

        proxy.request();  // 通过代理对象调用目标对象的方法
    }
}

以上内容基于GPT创建和整理。

参考

关于作者

来自一线全栈程序员nine的八年探索与实践,持续迭代中。欢迎关注“雨林寻北”或添加个人卫星codetrend(备注技术)。

标签:对象,代理,Proxy,realSubject,GPT,设计模式,public,Subject
From: https://www.cnblogs.com/r0ad/p/18048316

相关文章

  • 代理
    HTTP用的关键字是PROXYHTTPS也可以用PROXY也可以直接用HTTP或HTTPS,但是需要软件支持。SOCKS分v4和v5两个版本按 ProxysupportinChrome(googlesource.com) 的说法用SOCKSv4可以用SOCKS4或SOCKSSOCKSv5用SOCKS5某软件说支持SOCKS,但没说是v4还是v5,经过测试,SOCKS5很好用,SOCKS4......
  • 英语背单词 专四词汇 2024年03月 ChatGPT
     2024-03-01indexwordpronunciationpartsofspeechexplanationtranslationinChinese1inert/ɪˈnəːt/adjectiveLackingtheabilitytomoveorreact;inactive.惰性的;不活跃的2anticipation/ænˌtɪsɪˈpeɪʃən/nounTheactoflookingfo......
  • 代理模式2 (设计模式)
    ClassLoader的作用在java运行的时候,ClassLoader(类加载器)负责将类文件加载到内存中,并转化为java运行时的java类。ClassLoader是java虚拟的(JVM)的一部分,它的主要作用是动态的加载java类。 1.当java程序需要某个类时,ClassLoader负责将该类的字节码(.class)文件加载到内......
  • 反射和动态代理的联系
    动态代理和反射在Java编程中有一定的联系和相互补充的关系:综上所述,动态代理和反射在Java编程中常常结合使用,通过反射获取类的信息并利用动态代理创建代理对象,从而实现更灵活和动态的编程方式。联系:动态代理和反射都是在运行时进行操作的技术,能够在程序运行时动态地获取和操作类......
  • 动态代理实现实例
    importjava.lang.reflect.InvocationHandler;importjava.lang.reflect.Proxy;/*@author12817*//***学生接口,能跑,能吃,能写作文。*/interfaceStudent{voideat();voidrun();voidwrite();}/***小韭菜,能跑,能吃,能写作文。*/classOrd......
  • 解决Nginx代理转发中HTTP到HTTPS跳转问题的技术方案解析
    在进行Nginx代理转发时,经常会遇到HTTP到HTTPS跳转的问题,特别是在某些情况下,即使在程序中明确指定了使用HTTPS协议,仍然会出现跳转到HTTP的情况。本文将介绍一种解决这个问题的技术方案,并对问题的原因进行分析。问题描述在进行Nginx代理转发时,配置了HTTPS支持,但在程序中发起请求时......
  • 原型模式 (设计模式)
    对于熟悉JavaScript语言的前端程序员来说,原型模式是一种比较常用的开发模式,即使JavaScript引入了类的概念,但它也知识基于原型语法糖而已。不过如果你使用的是java C++你就很少使用原型模式。 原型模式的原理和应用: 如果对象的创建成本比较大,而同一个类的不同对象之间差......
  • 文心一言 VS 讯飞星火 VS chatgpt (204)-- 算法导论15.3 3题
    三、考虑矩阵链乘法问题的一个变形:目标改为最大化矩阵序列括号化方案的标量乘法运算次数,而非最小化。此问题具有最优子结构性质吗?需要写代码的时候,请用go语言。文心一言,代码正常运行:首先,我们要明确矩阵链乘法问题的原始形式:给定一个矩阵链(A_1,A_2,\ldots,A_n),我们要找到......
  • 实战上,通过一段ID 生成器代码,学习如何发现,代码质量的问题(设计模式)
    ID生成器的需求背景介绍ID中文翻译为标识Identifier,这个概念在生活,工作中随处可见,比如身份证、商业条形码、二维码、车牌号、驾照号。聚焦到软件开发中,ID常用来标识一些业务信息的唯一标识,比如订单的单号或者数据库中的唯一主键,比如地址中ID字段(实际上时没有业务含义的,对用......
  • 用ChatGPT试了一下,果然好用,生成的CRC的代码
    CEIWEI之前发布过一款Hash/CRC工具,支持从CRC3到CRC64的全部CRC类型功能小工具。因为是免费获取,不少小伙伴们加我微信,要注册码,着实有点忙,没有时间回复各位,抱歉!这几天,用ChatGPT试了一下,果然好用,生成的CRC的代码,稍加修改,直接可用。废话少说,上图!DelphiXE7代码:以上代码是ChatG......