探索设计模式的魅力:代理模式揭秘-软件世界的“幕后黑手”


设计模式专栏:http://t.csdnimg.cn/U54zu


目录

引言

一、魔法世界

1.1 定义与核心思想

1.2 静态代理

1.3 动态代理

1.4 虚拟代理

1.5 代理模式结构图

1.6 实例展示如何工作(场景案例)

 不使用模式实现

 有何问题

 使用模式重构示例

二、应用与实践

2.1 如何使用代理模式

2.2 工作中的实际案例

2.3 优点

2.4 缺点

三、避免陷阱与常见误区

3.1 缺点与可能的误用

3.2 性能和复杂度考虑

四、代理趋势 - 未来几年代理模式的展望


引言

    为何选择代理模式。

    在软件开发的世界里,随着项目规模的扩大和复杂性的增加,我们时常面临着这样的挑战:如何在不修改原始对象代码的情况下,为其增加新的操作或功能?这样的需求看似简单,实则在实际项目中经常遇到,而且解决起来并不容易。此时,一种强大的设计模式——代理模式(Proxy Pattern)应运而生,为我们提供了一种优雅而高效的解决方案。
    代理模式是一种结构型设计模式,它提供了一种方式来控制对另一个对象的访问。代理模式的核心思想是在原始对象之前引入一个代理对象,这个代理对象扮演着“中间人”的角色,负责处理客户端的请求,并根据需要决定是否将请求转发给原始对象。通过这种方式,我们可以在不修改原始对象代码的前提下,实现对原始对象行为的扩展或控制。
    代理模式在软件开发中的重要性不容忽视。它允许我们在不改变现有代码结构的情况下,为对象增加额外的职责或行为,从而提高了代码的灵活性和可扩展性。此外,代理模式还可以用于实现远程方法调用、权限控制、性能优化等场景,为软件开发提供了强大的支持。

    在本文中,我们将深入探讨代理模式的原理、实现方式以及应用场景。通过具体的示例和代码分析,我们将帮助读者更好地理解代理模式,并学会如何在实际项目中运用这一强大的设计模式。让我们一起踏上代理模式的探索之旅吧!

        

一、魔法世界

    在软件设计的世界里,代理模式以其独特的方式打开了一扇通往魔法世界的大门。在这个世界里,代理类扮演了魔法使者的角色,替真实对象处理请求,并在必要时将请求传递给真实对象。这种魔法般的操作,不仅让代码更加灵活,还为我们带来了许多意想不到的好处。

1.1 定义与核心思想

 定义

    代理模式是一种设计模式,它提供了一种代理对象来代表和控制另一个对象(真实对象)的访问。代理模式在不改变真实对象接口的前提下,为真实对象添加额外的操作或逻辑,如访问控制、延迟加载、性能优化等。

 核心思想

    代理模式的核心思想:在真实对象之前引入一个代理对象,这个代理对象负责接收客户端的请求,并根据需要决定是否将请求转发给真实对象。

 本质

  代理模式的本质:控制对象访问。

1.2 静态代理

    静态代理是最简单的一种代理模式实现方式。在静态代理中,代理类和真实对象类都实现了相同的接口,并且代理类持有一个真实对象类的实例。代理类在接收到请求后,会根据需要将请求转发给真实对象,或者在转发请求前后添加额外的逻辑。

    特定用途:静态代理通常用于在编译时就已经确定代理类和真实对象类关系的情况。例如,当我们需要为某个对象添加日志记录、权限验证等额外功能时,可以使用静态代理。由于静态代理需要在编译时确定代理类和真实对象类的关系,因此它通常用于功能相对固定、不会频繁变动的场景。

1.3 动态代理

    动态代理是一种更加灵活的代理模式实现方式。在动态代理中,代理类是在运行时动态生成的,而不需要提前编写好代理类的代码。动态代理利用了Java的反射机制和动态生成类的技术,可以在运行时动态地为目标对象创建代理对象。

    特定用途:动态代理通常用于需要在运行时动态地为目标对象添加额外功能的情况。例如,在AOP(面向切面编程)中,我们可以使用动态代理来实现横切关注点(如日志记录、事务管理等)的织入。由于动态代理是在运行时动态生成代理对象,因此它更加灵活,可以适应功能频繁变动的场景。

1.4 虚拟代理

    虚拟代理是一种特殊的代理模式实现方式。在虚拟代理中,代理类并不直接持有真实对象的实例,而是在需要时才创建真实对象。虚拟代理通常用于表示一个资源消耗较大或初始化时间较长的对象,通过延迟对象的创建来降低系统的资源消耗。

    特定用途:虚拟代理通常用于资源消耗较大或初始化时间较长的场景。例如,在加载大型图片或视频时,我们可以使用虚拟代理来延迟加载过程,直到用户真正需要查看图片或视频时才创建真实对象。虚拟代理通过延迟对象的创建,可以有效地降低系统的资源消耗和响应时间。

1.5 代理模式结构图

  1. 代理类(Proxy)代理类是代理模式的核心部分,它实现了与真实对象相同的接口。代理类负责接收客户端的请求,并根据需要决定是否将请求转发给真实对象。代理类还可以在执行请求前后添加额外的逻辑,如权限验证、日志记录等。
  2. 接口(Interface)接口定义了代理类和真实对象需要实现的方法。客户端通过接口与代理类和真实对象进行交互,从而实现了解耦。
  3. 真实对象(Real Object)真实对象是代理类所代表的实际对象,它实现了接口中定义的方法。真实对象负责处理代理类转发过来的请求,并返回结果。

1.6 实例展示如何工作(场景案例)

    假设我们有一个图片加载器,它负责从网络上加载图片。由于网络加载是一个耗时的操作,我们希望在加载图片之前先显示一个占位符,并在图片加载完成后替换占位符。

 不使用模式实现

    不使用模式来实现图片加载器的功能,我们可能需要直接在客户端代码中处理图片加载的逻辑,包括显示占位符、执行网络请求以及替换占位符。以下是一种不使用代理模式的实现方式:

    首先,我们仍然需要定义ImageLoader接口和RealImageLoader类,这些类将负责实际的图片加载工作。

public interface ImageLoader {  
    void loadImage();  
}  
  
public class RealImageLoader implements ImageLoader {  
    @Override  
    public void loadImage() {  
        // 模拟网络加载图片的耗时操作  
        try {  
            Thread.sleep(2000);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        System.out.println("图片加载完成!");  
    }  
}

    然后,在客户端代码中,我们需要负责处理显示占位符和替换占位符的逻辑。这可以通过在调用RealImageLoader的loadImage方法之前和之后手动添加这些逻辑来实现。

public class Client {  
    public static void main(String[] args) {  
        RealImageLoader realImageLoader = new RealImageLoader();  
  
        // 显示占位符  
        System.out.println("显示占位符...");  
  
        // 加载图片  
        new Thread(realImageLoader).start(); // 使用新线程来避免阻塞UI  
  
        // 等待图片加载完成(这里假设我们有一种机制来知道图片何时加载完成)  
        // 实际上,这通常涉及到一些复杂的同步机制,例如使用Future、CountDownLatch等  
  
        // 替换占位符为真实图片  
        System.out.println("替换占位符为真实图片...");  
    }  
}
    在这个实现中,我们创建了一个新的线程来执行RealImageLoaderloadImage方法,以避免阻塞主线程(通常是UI线程)。但是,这要求我们有一种机制来知道何时图片加载完成,以便我们可以安全地替换占位符。这可能涉及到一些复杂的同步机制,例如使用FutureCountDownLatch或其他并发工具。

 有何问题

    不使用代理模式的这种方法有几个缺点:

 1. 复杂性增加

  • 客户端代码需要处理更多的逻辑,包括同步和线程管理。

 2. 代码可读性和维护性下降

  • 由于加载逻辑和显示逻辑混合在一起,代码的可读性和可维护性可能会受到影响。

 3. 缺乏灵活性

  • 如果以后需要添加新的逻辑(如权限检查、日志记录等),客户端代码可能需要进行大量修改。

 4. 同步问题

  • 等待图片加载完成并替换占位符可能需要复杂的同步机制,这增加了出错的可能性。

 使用模式重构示例

    为了更好地理解代理模式的工作原理和解决以上的问题,我们使用代理模式来实现这个功能。

    首先,我们定义一个接口ImageLoader,它包含了加载图片的方法loadImage()

public interface ImageLoader {  
    void loadImage();  
}

    然后,我们创建一个真实对象RealImageLoader,它实现了ImageLoader接口,并实现了实际的图片加载逻辑:

public class RealImageLoader implements ImageLoader {  
    @Override  
    public void loadImage() {  
        // 模拟网络加载图片的耗时操作  
        try {  
            Thread.sleep(2000);  
        } catch (InterruptedException e) {  
            e.printStackTrace();  
        }  
        System.out.println("图片加载完成!");  
    }  
}

    接下来,我们创建一个代理类ProxyImageLoader,它也实现了ImageLoader接口,并在内部持有一个真实对象的引用。代理类负责接收加载图片的请求,并在必要时将请求转发给真实对象:

public class ProxyImageLoader implements ImageLoader {  
    private RealImageLoader realImageLoader;  
  
    public ProxyImageLoader(RealImageLoader realImageLoader) {  
        this.realImageLoader = realImageLoader;  
    }  
  
    @Override  
    public void loadImage() {  
        System.out.println("显示占位符...");  
        // 在真实对象加载图片之前,先显示占位符  
        realImageLoader.loadImage();  
        System.out.println("替换占位符为真实图片...");  
    }  
}

    最后,在客户端代码中,我们通过代理类来加载图片:

public class Client {  
    public static void main(String[] args) {  
        RealImageLoader realImageLoader = new RealImageLoader();  
        ProxyImageLoader proxyImageLoader = new ProxyImageLoader(realImageLoader);  
  
        proxyImageLoader.loadImage();  
    }  
}

    运行客户端代码后,我们可以看到以下输出:

显示占位符...  
图片加载完成!  
替换占位符为真实图片...

    通过代理模式,我们在不修改真实对象代码的情况下,实现了在加载图片之前先显示占位符的功能。这种魔法般的操作让我们可以更加灵活地控制对象的访问和扩展对象的行为。

        

二、应用与实践

    代理模式作为一种灵活且强大的设计模式,在软件开发中拥有广泛的应用场景。通过代理模式,我们可以提升系统性能、增强对对象的控制、实现延迟初始化和增强系统安全性。下面,我们将探讨如何使用代理模式,并通过实际案例来展示代理模式在工作中的价值。

2.1 如何使用代理模式

    使用代理模式通常需要以下几个步骤:

 1. 定义接口

  • 首先,我们需要定义一个接口,该接口将被真实对象和代理对象共同实现。这个接口定义了客户端与对象交互所需的方法。

 2. 创建真实对象

  • 实现接口,并实现接口中定义的具体业务逻辑。这是实际执行工作的对象。

 3. 创建代理对象

  • 同样实现接口,并在其内部持有真实对象的引用。代理对象负责处理客户端的请求,根据需要在调用真实对象的方法前后添加额外的逻辑。

 4. 客户端使用代理对象

  • 客户端通过代理对象与真实对象进行交互,而不需要直接与真实对象交互。代理对象根据需要决定是否将请求转发给真实对象。

2.2 工作中的实际案例

 1. 性能优化:缓存代理

  • 在Web应用中,我们经常需要处理大量的数据库查询操作。为了提高性能,我们可以使用缓存代理来缓存查询结果。当相同的查询再次发生时,代理可以直接从缓存中返回结果,而不需要再次访问数据库。这大大减少了数据库的负载,提高了系统的响应速度。

 2. 控制访问:权限代理

  • 在许多系统中,我们需要对用户的访问权限进行控制。通过权限代理,我们可以在用户请求访问资源之前进行权限验证。如果用户具有访问权限,代理将请求转发给实际资源;否则,代理将拒绝请求并返回错误消息。

 3. 延迟初始化:资源加载代理

  • 在处理大型资源(如大型图片、视频文件或远程数据)时,我们可以使用资源加载代理来延迟资源的加载。代理可以在用户实际需要查看资源时才加载资源,从而减少了系统启动时的资源消耗和加载时间。

 4. 安全性增强:安全代理

  • 在安全敏感的应用中,我们可以使用安全代理来增强系统的安全性。代理可以在请求被处理之前对请求进行安全检查,如验证用户身份、检查请求参数等。这有助于防止恶意请求对系统的攻击和破坏。

2.3 优点

 1. 提升性能

  • 通过缓存代理、延迟加载等方式,减少不必要的计算或资源消耗,提高系统性能。

 2. 增强控制

  • 通过权限代理、安全代理等,实现对对象访问的精细控制,保护系统的安全性和稳定性。

 3. 延迟初始化

  • 通过资源加载代理等方式,延迟对象的创建和资源的加载,降低系统启动时的负载。

 4. 安全性增强

  • 通过安全代理等方式,对请求进行安全检查,增强系统的安全性和鲁棒性。

2.4 缺点

 1. 额外复杂性

  • 代理模式的引入增加了系统的复杂性。你需要创建额外的代理类,并在其中实现与真实对象相同的接口。这可能会增加代码的维护成本,并需要额外的测试来确保代理类正确地实现了接口并正确地转发请求。

 2. 潜在的性能开销

  • 虽然代理模式可以提高性能,但在某些情况下,它也可能引入额外的性能开销。代理对象需要在客户端和真实对象之间进行额外的跳转,这可能会增加处理请求的时间。尤其是在代理对象需要进行大量逻辑处理时,这种性能开销可能更加明显。

 3. 可能的内存占用

  • 代理对象可能会占用额外的内存空间,特别是当代理对象持有大量数据或复杂逻辑时。如果系统中存在大量的代理对象,这可能会导致内存占用增加,从而影响系统的整体性能。

 4. 透明性问题

  • 代理模式的一个关键问题是它可能对客户端代码产生透明性问题。客户端代码需要知道它正在与代理对象交互,而不是直接与真实对象交互。这可能会导致客户端代码更加复杂,并需要额外的逻辑来处理代理对象。

 5. 灵活性限制

  • 在某些情况下,代理模式可能会限制系统的灵活性。由于代理对象需要在客户端和真实对象之间进行中转,这可能会限制真实对象的使用方式。例如,某些针对真实对象的优化或特殊用法可能无法在代理模式下直接实现。

三、避免陷阱与常见误区

    尽管代理模式为我们提供了许多便利和优势,但在实际应用中,如果不加以注意,我们可能会陷入一些陷阱和误区。在本章中,我们将探讨代理模式的缺点与可能的误用,并讨论如何避免这些问题,以及提供相关的解决方法和最佳实践。

3.1 缺点与可能的误用

 1. 过度使用

  • 代理模式可能会过度使用,导致系统中存在大量的代理对象。这不仅增加了代码的复杂性,还可能导致性能下降和内存占用增加。

 2. 不必要的代理

  • 有时,我们可能会在不必要的情况下使用代理模式,增加了系统的复杂性和维护成本。

 3. 不恰当的代理逻辑

  • 在代理对象中添加了过多的逻辑处理,可能会导致性能下降和逻辑混乱。

 4. 忽略透明性

  • 代理模式可能会影响系统的透明性,使客户端代码难以理解和维护。

3.2 性能和复杂度考虑

    使用代理模式时,我们需要权衡性能和代码复杂度之间的关系。过多的代理对象可能会导致性能下降,而复杂的代理逻辑可能会增加代码的维护成本。因此,在使用代理模式时,我们应该仔细考虑是否需要代理,以及代理中应该包含哪些逻辑。

 解决方法

 1. 适度使用

  • 避免过度使用代理模式,只在必要时使用代理对象。

 2. 简化代理逻辑

  • 尽量保持代理对象的逻辑简单,避免在代理中添加过多的业务逻辑。

 3. 保持透明性

  • 尽量保持代理对象的透明性,使客户端代码能够无缝地与代理对象进行交互。

 4. 合理设计接口

  • 设计合理的接口,使代理对象和真实对象能够方便地实现相同的接口,从而简化客户端代码。

 最佳实践

 1. 明确需求

  • 在使用代理模式之前,明确系统的需求,确定是否真正需要代理对象。

 2. 遵循单一职责原则

  • 代理对象应该只负责代理相关的逻辑,避免承担过多的职责。

 3. 测试覆盖

  • 对代理对象进行充分的测试,确保代理逻辑的正确性和性能。

 4. 文档化

  • 为代理对象和相关的逻辑提供清晰的文档说明,方便其他开发人员理解和维护代码。

四、代理趋势 - 未来几年代理模式的展望

    在本文的最后篇章,我们着眼未来,展望代理模式如何在最新技术的浪潮中不仅保持其重要性,而且变得更加关键。随着云计算、物联网(IoT)和边缘计算的兴起,代理模式预计将作为一种扩展性和安全性的重要工具而得到更广泛的采用。在分布式系统中,代理可以作为一个轻量级的中间件,协调不同服务之间复杂的交互,并在异构环境中提供缓冲和消息队列功能。
    我们预见,动态代理将变得更加灵活和强大,它可以实现在运行时向系统动态添加行为。这将配合微服务和自适应系统架构,允许软件更好地管理资源并快速响应变化。同时,随着人工智能和机器学习的集成,代理或许能够使用预测模型来自主优化其行为,提升系统表现和用户体验。
    在安全性领域,代理模式有望加强对网络流量的监控和过滤,特别是在面临更加复杂的网络攻击和隐私保护挑战的时代。智能代理可以实施更复杂的权限管理策略,并在必要时进行敏感操作的审计和验证
    结论是,随着技术的持续进步,代理模式将继续在现代软件架构中扮演重要角色。它不仅提供了设计灵活性和扩展性,而且在安全性、性能优化和服务管理方面提供了关键的支持。代理模式的未来看起来既光明又必要,它准备好在下一次技术革命中发挥其不可或缺的作用。

        

结语:通过本文的学习,相信你已经对代理模式有了深入的了解。掌握代理模式,让你在软件开发中更加游刃有余,轻松实现对象操作的灵活代理。期待你在未来的项目中,能够灵活运用代理模式,创造出更加出色的作品!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/380796.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Rust日报】2024-02-08 Loungy:使用 Rust 和 GPUI 开发的 MacOS 启动器

Mira Screenshare:基于 Rust 和 WebRTC 的高性能屏幕分享工具 一群大学生宣布推出了他们的期末项目:Mira Screenshare,一个开源、高性能的屏幕共享工具,由 Rust 和 WebRTC 构建。此项目支持 4k 60 FPS 和 110ms 端到端延迟的屏幕…

CS50x 2024 - Lecture 2 - Arrays

00:00:00 - Introduction 00:01:01 - Story Time 00:06:03 - Compiling make本身并不是编译器,实际上是一个自动运行编译器的程序,如c语言的clang clang -o hello hello.csrc/ $ clang -o hello hello_world.c /usr/bin/ld: /tmp/hello_world-67f51…

Oracle 面试题 | 19.精选Oracle高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

你的立身之本是什么?

去年发生的一切,大到疫情、政治经济形势、行业的萎靡和震荡,小到身边的跳槽、裁员、公司倒闭……似乎都在告诉我们: 当冲击到来的时候,它是不会提前跟你打招呼的。 接下来的10年,我们所面临的不确定性,比起…

Linux 软件管理(YUM RPM)

1 YUM yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次…

fps cf游戏,一键断网辅助工具

一键断网瞬移 工具特色:一改常规断网操作(断网开启,所有人都卡住,使得还原后找不到人的问题 ),不影响任何人移动,开启断网跟着别人一起走,其他人无任何异常卡顿。 工具功能&…

Linux应用程序几种参数传递方式

大家好,今天给大家介绍Linux应用程序几种参数传递方式,文章末尾附有分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!可进群免费领取。 在Linux中,应用程序可以通过多种方式接收参数。以下…

文心一言 VS 讯飞星火 VS chatgpt (198)-- 算法导论14.3 6题

六、用go语言,说明如何来维护一个支持操作MIN-GAP的一些数的动态集Q,使得该操作能给出Q中两个最接近的数之间的差值。例如,Q(1,5,9,15,18,22),则MIN-GAP返回18-153&#…

【EAI 011】SayCan: Grounding Language in Robotic Affordances

论文标题:Do As I Can, Not As I Say: Grounding Language in Robotic Affordances 论文作者:Michael Ahn, Anthony Brohan, Noah Brown, Yevgen Chebotar, Omar Cortes, Byron David, Chelsea Finn, Chuyuan Fu, Keerthana Gopalakrishnan, Karol Hausm…

【正式】今年第一篇CSDN(纯技术教学)

一、文件上传简介 文件上传漏洞是指用户上传了一个可执行的脚本文件(木马、病毒、恶意脚本、webshell等),并通过此脚本文件获得了执行服务器端命令的能力。上传点一般出现在头像、导入数据、上传压缩包等地方,由于程序对用户上传…

C语言笔试题之求出二叉树的最大深度(递归解决)

实例要求: 1、给定一个二叉树 root ,返回其最大深度;2、二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数; 案例展示: 实例分析: 1、判断根节点是否为空;2、分别递归处理左…

物联网数据隐私保护技术

在物联网(IoT)的世界中,无数的设备通过互联网连接在一起,不断地收集、传输和处理数据。这些数据有助于提高生产效率、优化用户体验并创造新的服务模式。然而,随着数据量的剧增,数据隐私保护成为了一个不能忽…

【java苍穹外卖项目实战二】苍穹外卖环境搭建

文章目录 1、前端环境搭建2、后端环境搭建1、项目结构搭建2、Git版本控制3、数据库创建 开发环境搭建主要包含前端环境和后端环境两部分。 前端的页面我们只需要导入资料中的nginx, 前端页面的代码我们只需要能看懂即可。 1、前端环境搭建 前端运行环境的nginx&am…

《MySQL 简易速速上手小册》第7章:MySQL监控和日志分析(2024 最新版)

文章目录 7.1 配置和使用 MySQL 监控工具7.1.1 基础知识7.1.2 重点案例:使用 Python 和 Prometheus 监控 MySQL 性能7.1.3 拓展案例 1:自动化 MySQL 慢查询日志分析7.1.4 拓展案例 2:实时警报系统 7.2 解读 MySQL 日志文件7.2.1 基础知识7.2.…

【Spring】Bean 的实例化方式

Spring 为 Bean 提供了多种实例化方式,通常包括4种方式 也就是说在 Spring 中为 Bean 对象的创建准备了多种方案,目的是:更加灵活 第一种:通过构造方法实例化 第二种:通过简单工厂模式实例化 第三种:通过…

【第二届 Runway短视频创作大赛】——截至日期2024年03月01日

短视频创作大赛 关于AI Film Festival竞赛概况参加资格报名期间报名方法 提交要求奖品附录 关于AI Film Festival 2022年成立的AIFF是一个融合了最新AI技术于电影制作中的艺术和艺术家节日,让我们得以一窥新创意时代的风采。从众多参赛作品中…

求职|基于Springboot的校园求职招聘系统设计与实现(源码+数据库+文档)

校园求职招聘系统目录 目录 基于Springboot的校园求职招聘系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、企业信息管理 3、公告类型管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选…

Android:Volley框架使用

3.15 Volley框架使用 Volley框架主要作为网络请求,图片加载工具。当应用数据量小、网络请求频繁,可以使用Volley框架。 框架Github地址:https://github.com/google/volley Volley框架的简单使用,创建项目Pro_VolleyDemo。将Github上下载Volley框架源代码,volley-master.zi…

华为机考入门python3--(11)牛客11-数字颠倒

分类:字符串 知识点: int转字符串 str int(num) 对字符串进行逆序 my_str str[::-1] 题目来自【牛客】 def reverse_integer(n): # 将整数转换为字符串 str_n str(n) # 使用[::-1]来反转字符串 reversed_str str_n[::-1] return reversed…

力扣刷题之旅:进阶篇(三)

力扣(LeetCode)是一个在线编程平台,主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目,以及它们的解题代码。 --点击进入刷题地址 一、动态规划(DP) 首先,让我们来…