GPT带我学-设计模式-代理模式

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

什么是代理模式

代理模式(Proxy Pattern)是设计模式中的一种结构型模式,它为其他对象提供一种代理以控制对这个对象的访问。

代理模式有三个主要角色:抽象主题(Subject)、真实主题(Real Subject)和代理(Proxy)。

抽象主题(Subject):定义了真实主题与代理之间的共同接口,这样真实主题和代理可以互相替换使用。

真实主题(Real Subject):指实际要被代理的对象。

代理(Proxy):提供了一个与真实主题相同的接口,它内部持有一个真实主题的引用,并在真实主题的实例化或执行某些操作前后进行控制或扩展。

代理模式的主要目的是在不改变真实主题的情况下,为其提供一个代理类来进行访问控制或增强功能。代理模式可以实现懒加载,即在真正需要使用真实主题的时候才进行实例化,从而节省资源和提高性能。代理模式还能提供额外的功能,例如在调用真实主题的方法前后进行日志记录、安全控制、事务管理等。

代理模式可以分为静态代理和动态代理。静态代理是通过手动编写代理类来实现的,而动态代理则是在运行时动态生成代理类。动态代理通常使用Java的反射机制来实现,可以减少冗余代码,并且对真实主题的访问完全透明。

总之,代理模式提供了一种间接访问对象的方式,可以控制对象的访问、增强对象的功能,并且可以在不改变真实对象的情况下进行扩展。

代理模式有几种形式

在设计模式中,代理模式有两种常见的形式:

静态代理(Static Proxy):静态代理需要手动编写代理类,代理类和真实主题类实现相同的接口或继承相同的父类,并在代理类中持有一个真实主题类的引用。静态代理在编译时就确定了代理对象和真实对象的关系。

动态代理(Dynamic Proxy):动态代理在运行时动态生成代理类,不需要手动编写代理类。Java中的动态代理通常使用Java反射机制实现,可以通过Proxy类和InvocationHandler接口来创建动态代理对象。动态代理可以代理接口或类,适用于需要代理多个不同类型对象的场景。

在静态代理和动态代理中,代理类都是通过调用真实主题类的方法,并在方法前后加上一些额外的逻辑(如日志记录、权限验证等)来控制或增强真实主题的功能。

除了静态代理和动态代理,还有一些其他的代理变体形式,如远程代理、虚拟代理、保护代理等,这些形式根据具体的应用场景和需求进行使用。

请举一个具体的静态代理例子

假设有一个接口 Subject,定义了一个抽象主题的操作方法 request()。现在我们需要用静态代理来实现在真实主题的执行前后进行日志记录。

首先,定义一个 Subject 接口:

public interface Subject {
    void request();
}

接下来,创建真实主题类 RealSubject,实现 Subject 接口:

public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("真实主题执行请求");
    }
}

然后,创建一个代理类 ProxySubject,实现 Subject 接口,并在 request() 方法的前后添加日志记录的逻辑:

public class ProxySubject implements Subject {
    private RealSubject realSubject;

    public ProxySubject(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void request() {
        System.out.println("代理主题执行请求之前的日志记录");
        
        // 调用真实主题的方法
        realSubject.request();
        
        System.out.println("代理主题执行请求之后的日志记录");
    }
}

最后,我们可以通过以下代码来使用静态代理:

public class Main {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        ProxySubject proxy = new ProxySubject(realSubject);
        proxy.request();
    }
}

运行程序,输出结果如下:

代理主题执行请求之前的日志记录
真实主题执行请求
代理主题执行请求之后的日志记录

可以看到,通过静态代理模式,我们在真实主题的执行前后添加了日志记录的逻辑,实现了对真实主题的控制和功能增强,而不需要修改真实主题类的代码。这是静态代理模式的一种常见应用场景。

同样的例子怎么改成动态代理模式呢

要将上述示例改为动态代理模式,需使用Java的动态代理实现。首先,需要借助 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口。

首先,定义 Subject 接口和 RealSubject 真实主题类,与上述示例相同。

接下来,创建一个实现 InvocationHandler 接口的代理处理器类 ProxyHandler,用于在真实主题的方法执行前后添加日志记录的逻辑。在 invoke() 方法中,可以定义增强的逻辑以及调用真实主题的方法。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class ProxyHandler implements InvocationHandler {
    private Object realSubject;

    public ProxyHandler(Object realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("代理主题执行请求之前的日志记录");

        // 调用真实主题的方法
        Object result = method.invoke(realSubject, args);

        System.out.println("代理主题执行请求之后的日志记录");

        return result;
    }
}

最后,可以通过以下代码来使用动态代理:

import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args) {
        RealSubject realSubject = new RealSubject();
        InvocationHandler handler = new ProxyHandler(realSubject);
        
        // 创建动态代理对象
        Subject proxySubject = (Subject) Proxy.newProxyInstance(
            realSubject.getClass().getClassLoader(),
            realSubject.getClass().getInterfaces(),
            handler
        );
        
        proxySubject.request();
    }
}

运行程序,输出结果与静态代理的例子相同:

代理主题执行请求之前的日志记录
真实主题执行请求
代理主题执行请求之后的日志记录

可以看到,通过动态代理模式,我们实现了在真实主题的执行前后添加日志记录的逻辑,而不需要直接操作代理类,使代理对象动态生成,并且能够透明地调用真实主题的方法。这是动态代理模式的一种常见应用场景。

补充说明(《Head First设计模式》)

java在java.lang.reflect包中有自己的代理实现方式,通过相关api可以动态创建一个代理类。
通过代理类去调用被代理的方法。
因为实际代理类是在运行时创建的,所以把java的这个技术叫做动态代理。
Java为我们动态创建了Proxy。我们通过实现InvocationHandler接口告诉Proxy去做什么。文章来源地址https://www.toymoban.com/news/detail-661099.html

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

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

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

相关文章

  • 跟着GPT学设计模式之桥接模式

    桥接模式,也叫作桥梁模式,英文是 Bridge Design Pattern。在 GoF 的《设计模式》一书中,桥接模式是这么定义的:“Decouple an abstraction from its implementation so that the two can vary independently。”翻译成中文就是:“将抽象和实现解耦,让它们可以独立变化。” 桥接模式通过将一个类的

    2024年03月13日
    浏览(25)
  • 跟着GPT学设计模式之单例模式

    单例设计模式(Singleton Design Pattern)一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫作单例设计模式,简称单例模式。 单例有几种经典的实现方式,它们分别是:饿汉式、懒汉式、双重检测、静态内部类、枚举。 处理资源访问冲突,

    2024年02月05日
    浏览(35)
  • 【chatgpt】让gpt带你掌握设计模式

    让gpt带你掌握设计模式 准备设计模式面试的 概述 什么是设计模式? 为什么设计模式重要? 设计模式的分类 创建型模式 (Creational Patterns) 单例模式 (Singleton Pattern) 工厂模式 (Factory Pattern) 抽象工厂模式 (Abstract Factory Pattern) 建造者模式 (Builder Pattern) 原型模式 (Prototype Pattern) 结

    2024年02月05日
    浏览(30)
  • 【离散数学】gpt教我学数学2

    对于给定的A、B和f,判断f是否为从A到B的函数:f:A→B.如果是,说明f是否为单射、满射、双射的. A=B=R笛卡尔积R,f(x,y)=y+1,x+1 对于给定的集合 A = B = R × R A=B=mathbb{R}timesmathbb{R} A = B = R × R 和函数 f : A → B f:Arightarrow B f : A → B , f ( ⟨ x , y ⟩ ) = ⟨ y + 1 , x + 1 ⟩ f(langle x,

    2024年02月09日
    浏览(35)
  • 【离散数学】gpt教我学数学6

    设A是n元集(n=1),则从A到A的函数中有几个双射函数,有几个单射函数? 设 A A A 为 n n n 元集,下面分别计算从 A A A 到 A A A 的双射函数和单射函数的数量: 双射函数的数量: 一个双射函数 f : A → A f:Arightarrow A f : A → A 必须是一一对应的,即 f f f 必须是一个双射。因此,可

    2024年02月10日
    浏览(24)
  • GPT教我学Vue-Router

    路由的基本知识点 Vue Router 是 Vue.js 官方的路由管理器。它允许你在 Vue 应用程序中构建单页面应用(SPA),并实现了客户端路由功能。下面是一些 Vue Router 的重要知识点: 路由的基本配置: 使用 Vue.use(VueRouter) 安装 Vue Router 插件。 创建一个路由实例 const router = new VueRouter(

    2024年02月11日
    浏览(26)
  • 设计模式之代理模式(静态代理&动态代理)

    目录 1、什么是代理模式 2、代理模式的结构 3、代理模式的实现 3.1 静态代理和动态代理概念 3.2 静态代理 3.3 动态搭理 3.3.1 代码实现 3.3.2 Proxy类讲解 4、动态代理VS静态代理 5、代理模式优缺点 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象

    2024年02月03日
    浏览(24)
  • 设计模式8:代理模式-动态代理

    上一篇:设计模式8:代理模式-静态代理 “动态”的含义是 代码生成代理类,一个代理类可以代理多个接口 。 动态区别于 死板 ,静态代理中一个代理类只能代理一个接口,其他不同的接口,就需要再手写不同的代理类,这就很 死板 。 动态代理类似于在安卓里面,我们常

    2024年02月09日
    浏览(23)
  • 设计模式8:代理模式-静态代理

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

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

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

    2024年02月12日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包